参见Apple在Swift上的网站页面:https : //developer.apple.com/swift/
Swift中是否有像Objective-C一样的块?如何创建和调用它们?
如何在Swift中执行异步请求?
快速创建与块相关的内存泄漏容易吗?如果是,您将如何避免它们?
(Objective-)C块的Swift等效项称为闭包。《The Swift Programming Language》一书中有一整章关于它们的内容。
根据使用闭包的上下文,可以使用非常简洁的语法声明/使用它。例如,可以采用如下方法(success: Bool, error: NSError) - > Void调用采用签名的完成处理程序的方法:
(success: Bool, error: NSError) - > Void
someMethod(otherParameters: otherValues, completionHandler:{ success, error in if !success { NSLog("I am a leaf on the wind: %@", error) } })
在闭包本质上提供流控制的情况下,还有一种尾随的闭包语法可以很好地理解。而且,您可以在想要简短的时候删除参数名称(以牺牲可读性为代价,但是在某些明显的情况下(如下面所示)是可以的)。通常,return语句也是隐式的。
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闭包创建参考循环。简而言之,捕获语义足够类似于大多数事物所需的“工作方式”,但又有足够的区别,以至于块/闭包使用的通用模式(例如,分派到后台/主线程并引用self的)。属性)不会引起循环。
self
循环仍然是可能的,但是有一个解决方案。这个答案已经有点长了,因此请查看文档中的“ 强大的闭包参考周期”以获取完整的解释。