gpt4 book ai didi

objective-c - 将 Swift 2 闭包转换为 Objective-C block

转载 作者:太空狗 更新时间:2023-10-30 03:43:21 35 4
gpt4 key购买 nike

我正在尝试在 Swift 2 中构建一个 Objective-C block ,以便将其添加到 NSArray 中,如下所示:

typealias CompletionBlock = () -> Void
let aBlock:CompletionBlock = {
print("Hello world!")
}
let nsArray = NSMutableArray()
nsArray.addObject(aBlock) // Error

我知道它与 Swift 数组一起工作得很好,但我需要一个 NSArray 来兼容现有的 Objective-C 代码。如果我使用 swift 数组,编译器将拒绝将其转换为 NSArray,因为它不会是 [AnyObject](它将是 [任何]).

这里的问题是,swift 闭包不是与 Objective-C block 相反的对象,Objective-C block 是幕后对象(它们是 NSBlock 的实例,它是 NSObject< 的子类)

所以我的问题是:如何在 swift 中创建 Objective-C block ?我试过在类型别名中使用 @convention (block) 但它不起作用。

最佳答案

编辑: 从 Swift 3 开始,这是完全没有必要的(甚至不起作用)。向 Objective-C 数组添加闭包在 Swift 3 中开箱即用。下面的答案仅对 Swift 2 有效。

我知道这是重复的,但我仍会发布来自 swift-closure-as-anyobject 的重构答案和 cast-closures-blocks以防万一有人先登陆这个。

解决方案是在将 Swift 闭包添加到 NSArray 之前使用 unsafeBitCast 函数将 Swift 闭包转换为 Objective-C 兼容对象,然后在 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()

关于objective-c - 将 Swift 2 闭包转换为 Objective-C block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362358/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com