iOS中块(Objective-C)和闭包(Swift)之间的区别



在教程中,有人写道两者在功能上是相同的——闭包比块更容易,它避免了块和内存管理的复杂性。我看过很多教程,但除了这些,我没有理解swift的"闭包"和Objective-C的"块"之间的区别。

摘录自:Apple股份有限公司"Using Swift with Cocoa and Objective-C"iBooks:

"Swift闭包和Objective-C块是兼容的,所以你可以将Swift闭包传递给期望块的Objective-C方法。Swift闭包与函数的类型相同,所以你甚至可以传递Swift函数的名称。

闭包与块具有相似的捕获语义,但有一个关键区别:变量是可变的,而不是复制的。换句话说,Objective-C中__block的行为是Swift中变量的默认行为。"

略有差异。有人提到一个;变量被捕获为变量,而不是值。这可能是有用的,也可能是陷阱。重要的是,你可以在Swift闭包中定义一个捕获列表,所以如果你在捕获列表中包含self.properties,那么该属性的值就会被捕获,而不是self。这也简化了捕获弱变量的过程。

显示差异的实际代码示例:

这确实编译:

let x : @convention(swift) (inout Int) -> ()

这不是:

let y : @convention(block) (inout Int) -> ()

带有错误(inout Int) -> () is not representable in Objective-C

最新更新