我通过桥接头在我的 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_RETAINEDCF_RETURNS_NOT_RETAINED 注释函数。
    在你的情况下:
    - (CFArrayRef)someMethod:(someType)someParameter CF_RETURNS_NOT_RETAINED;
    
  • 或者在 Swift 中使用 takeUnretainedValue()takeRetainedValue() 将非托管对象转换为内存管理对象。在你的情况下:
    var cfArr = myInstance.someMethod(someValue).takeUnretainedValue()
    
  • 10-08 00:46