我试图在Swift 2中构建一个Objective块,以便将它添加到NSArray中,如下所示:
typealias CompletionBlock = () -> Void
let aBlock:CompletionBlock = {
print("Hello world!")
}
let nsArray = NSMutableArray()
nsArray.addObject(aBlock) // Error我知道它在Swift数组中工作得很好,但是为了与现有的Objective代码兼容,我在这里需要一个NSArray。如果我使用快速数组,编译器将拒绝将其转换为NSArray,因为它将不是[AnyObject] (将是[Any])。
这里的问题是,快速关闭并不是一个与目标C块相反的对象,后者是场景后面的对象(它们是NSBlock的实例,它是NSObject的一个子类)。
所以我的问题是:如何快速创建一个目标C块?我试过在类型中使用@convention (block),但它不起作用。
发布于 2016-02-12 12:47:21
编辑:从Swift 3开始,这是完全不必要的(甚至不起作用)。将闭包添加到Objective数组中,可以在Swift 3中打开方框。下面的答案仅适用于Swift 2。
我知道这是一个副本,但我仍然会发布一个来自swift-closure-as-anyobject和cast-closures-blocks的重构答案,以防有人首先使用这个答案。
解决方案是使用unsafeBitCast函数在将其添加到NSArray之前将Swift闭包转换为与object兼容的对象,然后再在Swift中使用它。
// 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()https://stackoverflow.com/questions/35362358
复制相似问题