将Swift 2闭包转换为Objective-C块
发布时间:2020-12-14 04:42:31 所属栏目:百科 来源:网络整理
导读:我正在尝试在 Swift 2中构建一个Objective-C块,以便将它添加到NSArray中,如下所示: typealias CompletionBlock = () - Voidlet aBlock:CompletionBlock = { print("Hello world!")}let nsArray = NSMutableArray()nsArray.addObject(aBlock) // Error 我知
我正在尝试在
Swift 2中构建一个Objective-C块,以便将它添加到NSArray中,如下所示:
typealias CompletionBlock = () -> Void let aBlock:CompletionBlock = { print("Hello world!") } let nsArray = NSMutableArray() nsArray.addObject(aBlock) // Error 我知道它可以很好地使用Swift数组,但我需要一个NSArray来与现有的Objective-C代码兼容.如果我使用swift数组,编译器将拒绝将其强制转换为NSArray,因为它不会是[AnyObject](它将是[Any]). 这里的问题是swift闭包不是与Objective-C块相反的对象,Objective-C块是场景后面的对象(它们是NSBlock的实例,它是NSObject的子类) 所以我的问题是:如何在swift中创建一个Objective-C块?我尝试在类型中使用@convention(块),但它不起作用. 解决方法
编辑:从Swift 3开始,这是完全没必要的(甚至不起作用).向Objective-C数组添加闭包在Swift 3中开箱即用.下面的答案仅适用于Swift 2.
我知道这是重复的但是我仍然会发布swift-closure-as-anyobject和cast-closures-blocks的重构答案,以防任何人首先登陆这个. 解决方案是使用unsafeBitCast函数将Swift闭包转换为Objective-C兼容对象,然后将其添加到NSArray并在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() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |