(Objective-)C 块的 Swift 等效项称为闭包。在 The Swift Programming Language 书籍中有关于它们的 a whole chapter。
根据你使用闭包的上下文,你可以用非常简洁的语法声明/使用它。例如,可以像这样调用带有签名为(success: Bool, error: NSError) - > Void 的完成处理程序的方法:
someMethod(otherParameters: otherValues, completionHandler:{ success, error in
if !success { NSLog("I am a leaf on the wind: %@", error) }
})
还有一个尾随闭包语法,在闭包本质上提供流控制的情况下读起来很好。当您想要非常简短时,您可以删除参数名称(以牺牲可读性为代价,但在以下一些明显的情况下没关系)。通常return 语句也是隐含的。
myArray.sort { $0 < $1 }
let squares = myArray.map { value in
value * 2
}
Swift 本身没有任何用于异步请求的功能,因此您可以使用现有的 API。不过,您可以使用尾随闭包语法:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// do some async stuff
NSOperationQueue.mainQueue().addOperationWithBlock {
// do some main thread stuff stuff
}
}
在大多数情况下,您无需像使用 ObjC 块那样担心使用 Swift 闭包创建引用循环。简而言之,捕获语义与大多数东西的“正常工作”方式非常相似,但对于块/闭包的常见模式使用(例如调度到后台/主线程并引用@987654329 @ 的属性)不会导致循环。
不过,循环仍然是可能的,并且有一个解决方案。这个答案已经有点长了,所以请查看文档中的Strong Reference Cycles for Closures 以获得完整的解释。