将Swift 2闭包转换为Objective-C块

将Swift 2闭包转换为Objective-C块,第1张

概述我正在尝试在 Swift 2中构建一个Objective-C块,以便将它添加到NSArray中,如下所示: typealias CompletionBlock = () -> Voidlet aBlock:CompletionBlock = { print("Hello world!")}let nsArray = NSMutableArray()nsArray.addObjec 我正在尝试在 Swift 2中构建一个Objective-C块,以便将它添加到NSArray中,如下所示:

typealias CompletionBlock = () -> VoIDlet 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 managementtypealias CompletionBlock = @convention(block) () -> VoIDlet 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()
总结

以上是内存溢出为你收集整理的将Swift 2闭包转换为Objective-C块全部内容,希望文章能够帮你解决将Swift 2闭包转换为Objective-C块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1007233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存