gpt4 book ai didi

nsarray - 如何将 CFArray 转换为 Swift 数组?

转载 作者:IT王子 更新时间:2023-10-29 05:10:14 28 4
gpt4 key购买 nike

根据 Apple 的“将 Swift 与 Cocoa 和 Objective-C 结合使用”,“在 Swift 中,您可以互换使用每一对免费桥接基础和核心基础类型”。这使得使用 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 语言...

最佳答案

根据 Swift 编译器和 Swift 文档的当前状态,这是如何做到这一点的。希望这在以后的测试版中得到清理。

更新:从 Beta 5 开始,reinterpretCast 已重命名为 unsafeBitCast,并且必须将 CTLine 对象作为输入发送给它。方法 #2 仍然不起作用。


方式 #1 - 直接使用 CFArray

let line: CTLine = reinterpretCast(CFArrayGetValueAtIndex(lines, 0))

关于 Gary Makin 的评论 - Ref 可以从 CTLineRef 中删除,但这不会改变 ARC 与非 ARC。根据 Using Swift with Cocoa and Objective-C pages 53-54,ref 和 non-ref 与编译器相同。尝试调用 CFRelease 会导致编译器错误。


方式 #2 - 将 CFArray 转换为 Swift 数组 - 目前不起作用

理想情况下,我们希望将线条转换为 CTLine 对象的 Swift 数组,因为我们知道这是 CTFrameGetLines 返回的内容,从而在转换后为我们提供类型安全。可能由于编译器错误,数组可以转换为 [AnyObject] 数组,但不能转换为 [CTLine]。根据Apple's documentation ,这应该有效:

let linesNS: NSArray  = CTFrameGetLines(frame)
let linesAO: [AnyObject] = linesNS as [AnyObject]
let lines: [CTLine] = linesAO as [CTLine]

这会将 CFArray 转换为 NSArray,然后将 NSArray 转换为 Swift Array [AnyObject],然后将该数组向下转换为特定类型 CTLine。这可以编译,但是当它运行时,最后一行出现 EXC_BREAKPOINT 崩溃。

关于nsarray - 如何将 CFArray 转换为 Swift 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684750/

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