【发布时间】:2014-07-10 19:29:12
【问题描述】:
根据 Apple 的“Using Swift with Cocoa and Objective-C”,“在 Swift 中,您可以互换使用每对免费桥接的 Foundation 和 Core Foundation 类型”。这使得使用 Core Foundation 听起来比实际上更简单......
我正在尝试使用从 CoreText 返回的 CFArray。我有这个代码:
let lines: CFArrayRef = CTFrameGetLines(frame)
我看到了两种可能的方式来访问这个数组的成员。现在两者都不适合我。
方式 #1 - 直接使用 CFArray
let line: CTLineRef = CFArrayGetValueAtIndex(lines, 0)
这会产生错误“'ConstUnsafePointer' in not convertible to 'CTLineRef'”。强制转换似乎没有改变这个错误。
同样,我喜欢“可互换”地使用行作为 Swift 数组,就像它说的那样。然而,
let line: CTLineRef = lines[0]
产生错误“'CFArrayRef' 没有名为 'subscript' 的成员”
方式 #2 - 将 CFArray 转换为 Swift 数组
var linesArray: Array = [CTLineRef]()
linesArray = bridgeFromObjectiveC(lines, linesArray.dynamicType)
在这里,我声明了一个 Swift 数组并将其设置为等于桥接的 CFArray。这编译没有错误,但是当我运行它时,我在第二行得到一个 EXC_BREAKPOINT 崩溃。也许我在这个上没有正确使用 Swift 语言...
【问题讨论】:
-
看来使用 reinterpretCast 修复了方式 #1(将不安全指针转换为 CTLineRef)。不过,我很想得到一些关于 #2 的反馈。
-
上次我检查过,您通常可以通过
NSArray进行双重转换,从CFArray到 SwiftArray。 (例如let nsArray = CTFrameGetLines(frame) as NSArray; let array = nsArray as [CTLine])但我没有尝试过这些 API。 -
感谢您的快速反馈!正如你所写的那样,它可以编译,但在第二条转换线上有一个 EXC_BAD_INSTRUCTION 崩溃。如果删除“as [CTLine]”,那么它可以工作,但数组元素在访问时必须重新解释。
-
根据我的理解和使用,rickster 的建议是正确的,您可能遇到了编译器错误。另一条评论,您应该能够始终将“Ref”从 CF 类型的名称末尾删除。这样做允许您使用 ARC 而不必显式释放对象。请参阅此 Apple WWDV 视频的最后一部分 Swift Interoperability In Depth。
-
你有没有想过这个问题?
标签: nsarray swift core-foundation