我通过桥接头在我的 Swift 项目中使用了一个 Objective-C 类。方法签名看起来像这样:
- (CFArrayRef)someMethod:(someType)someParameter;
我首先获取类的实例,调用方法并存储值:
var myInstance = MyClassWithThatMethod();
var cfArr = myInstance.someMethod(someValue);
然后尝试在数组中获取一个值:
var valueInArrayThatIWant = CFArrayGetValueAtIndex(cfArr, 0);
但是我收到错误
Unmanaged<CFArray>' is not identical to 'CFArray'
。 Unmanaged<CFArray>
甚至是什么意思?我查看了 How to convert CFArray to Swift Array? 但我不需要将数组转换为 swift 数组(但是这会很好)。我只需要能够从数组中获取值。
我还尝试了将
CFArray
传递到 in this answer 概述的函数中的方法:func doSomeStuffOnArray(myArray: NSArray) {
}
但是我在使用时遇到了类似的错误:
doSomeStuffOnArray(cfArr); // Unmanaged<CFArray>' is not identical to 'NSArray'
我使用
CFArray
是因为我需要存储一个 CGPathRef
数组,它不能存储在 NSArray
中。那么我应该如何在 Swift 中使用
CFArray
呢? 最佳答案
如中所述
Working with Core Foundation Types ,有两种可能的解决方案,当
你从你自己在 Swift 中导入的函数返回一个 Core Foundation 对象:
CF_RETURNS_RETAINED
或 CF_RETURNS_NOT_RETAINED
注释函数。在你的情况下:
- (CFArrayRef)someMethod:(someType)someParameter CF_RETURNS_NOT_RETAINED;
takeUnretainedValue()
或 takeRetainedValue()
将非托管对象转换为内存管理对象。在你的情况下:var cfArr = myInstance.someMethod(someValue).takeUnretainedValue()