闭包(也称为块或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()