首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Swift 2闭包转换为目标C块

将Swift 2闭包转换为目标C块
EN

Stack Overflow用户
提问于 2016-02-12 12:11:13
回答 1查看 1.8K关注 0票数 7

我试图在Swift 2中构建一个Objective块,以便将它添加到NSArray中,如下所示:

代码语言:javascript
复制
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),但它不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-12 12:47:21

编辑:从Swift 3开始,这是完全不必要的(甚至不起作用)。将闭包添加到Objective数组中,可以在Swift 3中打开方框。下面的答案仅适用于Swift 2。

我知道这是一个副本,但我仍然会发布一个来自swift-closure-as-anyobjectcast-closures-blocks的重构答案,以防有人首先使用这个答案。

解决方案是使用unsafeBitCast函数在将其添加到NSArray之前将Swift闭包转换为与object兼容的对象,然后再在Swift中使用它。

代码语言:javascript
复制
// 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()
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35362358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档