dea*_*eef 6 closures objective-c objective-c-blocks swift2
我正在尝试在Swift 2中构建一个Objective-C块,以便将其添加到NSArray类似的内容中:
typealias CompletionBlock = () -> Void
let aBlock:CompletionBlock = {
print("Hello world!")
}
let nsArray = NSMutableArray()
nsArray.addObject(aBlock) // Error
Run Code Online (Sandbox Code Playgroud)
我知道它可以很好地使用Swift数组,但我需要一个NSArray与现有Objective-C代码兼容的地方.如果我使用swift数组,编译器将拒绝将其转换为a,NSArray因为它不会是a [AnyObject](它将是a [Any]).
这里的问题是swift闭包不是与Objective-C块相反的对象,Objective-C块是场景后面的对象(它们的实例NSBlock是其子类NSObject)
所以我的问题是:如何在swift中创建一个Objective-C块?我尝试过@convention (block)在typealias中使用但它不起作用.
编辑:从Swift 3开始,这是完全没必要的(甚至不起作用).向Objective-C数组添加闭包在Swift 3中开箱即用.下面的答案仅适用于Swift 2.
我知道这是重复的但是我仍然会发布swift-closure-as-anyobject和cast-closures-blocks的重构答案,以防任何人首先登陆这个.
解决方案是使用该unsafeBitCast函数将Swift闭包转换为Objective-C兼容对象,然后NSArray在Swift中使用它之前将其添加到a 和back.
// The `@convention(block)` is important here in order to get
// Objective-C like memory management
typealias CompletionBlock = @convention(block) () -> Void
let aBlock:CompletionBlock = {
print("Hello world!")
}
let nsArray = NSMutableArray()
let blockObject = unsafeBitCast(aBlock, AnyObject.self)
nsArray.addObject(blockObject)
let closureObject = nsArray[0]
let closure = unsafeBitCast(closureObject, CompletionBlock.self)
closure()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |