如何将 CFArray 转换为 Swift 数组?

2024-01-09

根据 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'无法转换为'CTLineRef'”。铸造似乎并没有改变这个错误。

同样,我很想将行“可互换地”用作 Swift 数组,就像它说的那样。然而,

let line: CTLineRef = lines[0]

产生错误“'CFArrayRef'没有名为'下标'的成员”


方法 #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 的评论 - 可以从 CTLineRef 中删除 Ref,但这不会改变 ARC 与非 ARC。根据《Using Swift with Cocoa and Objective-C》第 53-54 页,ref 和 non-ref 与编译器相同。尝试调用 CFRelease 会导致编译器错误。


方法 #2 - 将 CFArray 转换为 Swift 数组 -目前不工作

理想情况下,我们希望将行转换为 CTLine 对象的 Swift 数组,因为我们知道这就是 CTFrameGetLines 返回的内容,从而在转换后为我们提供类型安全。可能由于编译器错误,该数组可以转换为 [AnyObject] 数组,但不能转换为 [CTLine]。根据苹果的文档 https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html,这应该有效:

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 崩溃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 CFArray 转换为 Swift 数组? 的相关文章

  • xcode 错误:...此类与键 ibShadowedLargeTitleTextAttributes 的键值编码不兼容

    我不断收到此错误 在我使用颜色集之前 该应用程序就可以运行 该错误说明了一些有关ibShadowedLargeTitleTextAttributes 我没有为大标题阴影设置任何颜色 我使用默认值 透明 我重新启动了 Xcode 使用了阴影颜
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • 在 Pages 文稿中打开文本—Swift

    在我的 Swift 2 应用程序中 用户通过文本字段创建一串文本 然后将其共享给另一个应用程序 现在 我只能将文本共享为 txt 文件 这不提供选项Open In Pages当我打开系统共享对话框时 如何才能让用户可以选择将输入的文本作为
  • Swift:如何让游戏中的角色只有落地后才能跳跃?

    我正在开发一款游戏 我的角色可以从一个陆地跳到另一个陆地 我已经把所有事情都做好了 除了我剩下的问题是 如果你继续点击屏幕 他可以永远跳跃 我希望他必须先落地才能再次跳跃 import SpriteKit import GameplayKi
  • 在 macOS 上使用 Swift 3 从剪贴板读取

    我是 Swift 的初学者 我想弄清楚如何在 macOS Swift 3 上读取已复制到剪贴板的内容 我搜索了很多 但似乎找不到任何有效的东西 我从网上尝试过的一些事情 var pasteboardItems NSPasteboardIte
  • Swift PageControl 当前页面上更大的点

    我试图将当前页面的点缩放为大于未 选择 的点 我正在使用滚动视图委托来确定哪个页面是当前的 目前 点的大小没有变化 我将如何实现这一目标 func scrollViewDidEndDecelerating scrollView UIScro
  • Swift - 保存在 TableView 中选择的复选标记

    我对 Swift 相当陌生 并且在 TableView 多重选择方面遇到问题 我有多个选择 可以用复选标记进行检查 类似于待办事项列表 当我检查项目时 我希望能够返回 ListView 并保存我的选择 我假设将其保持在已保存状态的代码将位于
  • 如何在 iOS swift 中集成 Google Pay?

    嗨 朋友们 我搜索过有关 iOS swift 中谷歌支付集成的信息 我没有找到任何相关的解决方案 请帮助我如何解决这个问题 如果有任何链接或示例 请提供链接并指导我 谢谢 这是关于在印度发起 Google Pay 操作的问题吗 例如 使用
  • didRegisterForRemoteNotificationsWithDeviceToken 停止被调用 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在测试我的应用程序是否使用 Push Notifs 一整天都好好的 突然就不行了 设置完全没有变化 经过更多调试后 我发现该函
  • Swiftui 应用程序在 iOS 14 / 15 上使用不同的 SearchBar (ViewModifier) 时崩溃

    我在 iOS 14 上使用 SwiftlySearch 在 iOS 15 上使用 searchable struct CompatibleSearchBarModifier ViewModifier Binding var text Str
  • 排除 Realm 模型类

    我的应用程序中配置了两个领域文件 我想存储我的Log将模型与其他模型分开保存为单独的文件 我的问题是我也看到了我的Log我不想要的默认 Realm 文件中的模型类 如何从给定的 Realm 文件中排除特定的模型类 我使用主 Realm 文件
  • iOS swift 应用程序启动时出现黑屏

    我有个问题 当我启动我的应用程序时 会看到黑屏几秒钟 然后出现启动屏幕 我的启动画面不是默认的 我使用了视图控制器 因为我的启动画面有一个动画 我搜索了一个解决方案 我得到了这个 在我的闪屏加载 iPhone 之前出现黑屏 https st
  • 将 NSDate 转换为 SWIFT 中具有特定时区的字符串

    在我的核心数据库中 我有一个带有 NSDate 属性的 新闻 实体 我的应用程序遍布全球 新闻已发布2015 09 04 22 15 54 0000法国时间 GMT 2 为了保存日期 我将其转换为 UTC 格式 let mydateForm
  • 错误:“Int”无法转换为“@lvalue Float”

    给定以下函数 func greatestCommonDenominator first Int second Int gt Int return second 0 first greatestCommonDenominator second
  • UINavigationControllerDelegate的didShowViewController方法被调用了两次

    class ViewController UIViewController UINavigationControllerDelegate override func viewDidLoad super viewDidLoad navigat
  • 如何过滤掉数组的数组

    您好 我有一个包含多个值的数组 我想尝试过滤掉搜索栏的索引 英语术语的一个例子是这样的 给我名称 Name2 的索引 并通过检查每个索引的第一个值中的所有字符串来执行此操作 Code Multiple Errors var received
  • CNContact 添加新的联系人问题

    我在通过以下方式添加联系人时遇到问题联系框架 我使用的是装有 iOS 12 1 2 的 iPhone 5s 设备 我添加联系人的代码如下 let saveRequest CNSaveRequest saveRequest add self
  • 我可以在 NS_SWIFT_NAME 中使用保留关键字吗?

    我正在尝试使 Objective C 委托协议更漂亮以便在 Swift 中使用 但我在弄清楚如何使用时遇到了一些麻烦NS SWIFT NAME 是否可以使用NS SWIFT NAME指定 Swift 名称中与 Objective C 关键字
  • 在 Swift 中将 Int 转换为 UInt32

    我正在制作一个 Tcp 客户端 因此使用CFStreamCreatePairWithSocketToHost它期望第二个参数为 UInt32 这是我正在尝试做的事情的示例 func initNetwork IP String Port In
  • 如何在 Swift 中使用 substringToIndex? [复制]

    这个问题在这里已经有答案了 我在这一行收到编译器错误 UIDevice currentDevice identifierForVendor UUIDString substringToIndex 8 类型 String Index 不符合协

随机推荐