【问题标题】:Why is there no Objective C AddressBook Framework for iOS, and how to best tackle the problems with C in Swift?为什么没有适用于 iOS 的 Objective C AddressBook Framework,以及如何最好地解决 Swift 中的 C 问题?
【发布时间】:2014-12-07 18:47:14
【问题描述】:

这可能是非常通用的,而不是一般性的框架问题,而不是编程问题。但是,鉴于 Swift,以及您与 C API 交互的繁琐甚至有时不可能完成的任务,这个问题非常相关。

在为 iOS 构建新应用时,我发现使用地址簿框架确实很难。首先,对于许多 CoreFoundation 方法,您必须进行令人不舒服的指针传递。其次,这些函数大多返回那些丑陋的非托管对象,你必须弄清楚它们是否被保留(ARC 已经有好几年了!)。通过标识符访问属性非常麻烦,而且远非类型安全。最后,由于还没有 C 函数指针支持,你甚至不能调用 ABAddressBookRegisterExternalChangeCallback(addressBook: ABAddressBook!, callback: ABExternalChangeCallback, context: UnsafeMutablePointer<Void>),因为 ABExternalChangeCallback 到目前为止只在 Objective-C 中定义!

然后我发现Mac OS版本的AddressBookFramework中有一些不错的Objective-C Api。多么不公平! iOS 框架不是更年轻吗?你认为苹果为什么这样做?在您看来,他们什么时候会改变这一点?我是否遗漏了什么,iOS 也有 Objective-C Api 吗?

也欢迎任何关于如何以最方便、最美观的方式解决上述问题的建议!就我而言,我正在编写一个完整的包装器来掩盖所有讨厌的指针——C-Function——和全局常量的丑陋。准备好后,我会将其提交给 StackExchange 和 Github,让其他人受益并讨论我的解决方案。

编辑:终于设法将我的包装器上传到 GitHub。看 https://github.com/SocialbitGmbH/SwiftAddressBook

【问题讨论】:

    标签: ios objective-c c swift abaddressbook


    【解决方案1】:

    我同意你关于 iOS 为访问地址簿提供的内容。

    我已经发布了answer,解释了我是如何处理问题的,使用 swift 的一些功能方面,以及我如何处理提取非托管对象。

    简单地说:

    • 我定义了一个自定义运算符,允许我链接函数调用来转换一些输入数据
    • 我实现了 2 个通用函数来提取非托管对象
    • 发布了一些代码来展示我如何访问通讯录、遍历所有联系人并为每个联系人检索一些数据

    【讨论】:

    • 谢谢,我真的很喜欢这种方法。尤其是 >>> 运算符,因为它是一个非常漂亮的运算符(本着 Haskell 绑定运算符的精神?)。不过,我会将这个问题再留几天。也许我们可以收集到更多这样有趣的想法!
    • 我不知道 Haskell,但我是在阅读了一些关于 Swift 和函数式编程的内容后以这种方式实现的,所以我不会惊讶它是从其他语言带来的 :)
    • 我有没有提到任何文件?我所做的是阅读 API 规范、阅读有关非托管内容、一些博客、stackoverflow Q/A 等。实际实现已经过多次改进——第一个版本更长且未优化。所以,没有自上而下的文档解释我是如何到达那里的。
    • 抱歉造成误解,我错误地解释为您阅读了一些显示 Swift 函数式编程能力的特定文档/网站/博客。我很想读它,因为我喜欢 Swift 和函数式编程
    • blog post 也非常鼓舞人心。对函数式编程的良好介绍,迭代方法有助于理解他如何从过程式编程转向函数式编程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2011-10-08
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2021-01-10
    相关资源
    最近更新 更多