Swift封闭基础

示例

闭包(也称为lambda)是可以在程序内存储和传递的代码段。

let sayHi = { print("Hello") }
// The type of sayHi is "() -> ()", aka "() -> Void"

sayHi()  // prints "Hello"

与其他函数一样,闭包可以接受参数并返回结果或引发错误:

let addInts = { (x: Int, y: Int) -> Int in
    return x + y
}
// The type of addInts is "(Int, Int) -> Int"

let result = addInts(1, 2)  // 结果是3

let divideInts = { (x: Int, y: Int) throws -> Int in
    if y == 0 {
        throw MyErrors.DivisionByZero
    }
    return x / y
}
// The type of divideInts is "(Int, Int) throws -> Int"

闭包可以从其范围捕获值:

// 该函数返回另一个返回整数的函数
func makeProducer(x: Int) -> (() -> Int) {
    let closure = { x }  // x被闭包捕获
    return closure
}

// 这两个函数调用使用完全相同的代码,
// 但是每个闭包具有不同的值。
let three = makeProducer(3)
let four = makeProducer(4)
three()  // 返回3
four()  // 返回4

闭包可以直接传递给函数:

let squares = (1...10).map({ $0 * $0 })  // 返回[1、4、9、16、25、36、49、64、81、100]
let squares = (1...10).map { $0 * $0 }

NSURLSession.sharedSession().dataTaskWithURL(myURL,
    completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in
        if let data = data {
            print("Request succeeded, data: \(data)")
        } else {
            print("Request failed: \(error)")
        }
    }).resume()