首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift等效(__bridge NSArray*)

Swift等效(__bridge NSArray*)
EN

Stack Overflow用户
提问于 2014-09-04 20:07:21
回答 1查看 3.7K关注 0票数 2

我正试图用斯威夫特获得一份具有特定名字的联系人名单。我有以下代码:

代码语言:javascript
运行
复制
let owner = owners[indexPath.row];

var addressBook = ABAddressBookCreateWithOptions(nil, nil)
var addressBookRef: ABAddressBookRef = Unmanaged<NSObject>.fromOpaque(addressBook.toOpaque()).takeUnretainedValue()

let ownerName: NSString = owner["name"]! as NSString

let allContacts = ABAddressBookCopyPeopleWithName(addressBookRef, ownerName)

println("All Contacts: \(allContacts)")

显然,allContacts的值为Swift.Unmanaged。我希望allContacts能成为NSArray

在我接下来的教程中,allContacts通过将(__bridge NSArray*)添加到ABAddressBookCopyPeopleWithName(addressBookRef, ownerName)来桥接到ABAddressBookCopyPeopleWithName(addressBookRef, ownerName)

是什么引起了这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-04 22:58:14

  1. 您所做的包装/展开UnmanagedOpaque类型比必要的要多得多。你的台词: var addressBookRef: ABAddressBookRef =ABAddressBookRef 相当于: var addressBookRef = addressBook.takeUnretainedValue() (此外,您应该使用let,除非您希望为该变量赋值,这似乎是不可能的。优化器将感谢您。)
  2. 在将参数传递给AddressBook API时,您也不需要转换为基金会类型。但是我不能让ABAddressBookCopyPeopleWithName在我的测试中返回一个非空数组,即使使用ObjC也是如此,所以很难说。
  3. 如果只想打印数组,则只需要以下内容(由于上述问题,使用ABAddressBookCopyArrayOfAllPeople代替,但返回数组的用法相同): 设addressBook: ABAddressBook = ABAddressBookCreateWithOptions(nil,nil).takeRetainedValue() allContacts =.takeRetainedValue println("All Contact:(allContacts)") (大概是在获取addressBook和使用它之间的某个时候,您要么检查ABAddressBookGetAuthorizationStatus(),要么调用ABAddressBookRequestAccessWithCompletion,对吗?)
  4. 如果要处理数组中的ABRecord值,则需要进行一些转换。CoreFoundation类型桥接到基金会类型,基础数组桥接到Swift数组,但它并不能自动地从CF连接到Swift。 ((allContacts as NSArray) as ABRecord) { let name =NSArray(Name)} (我在该for语句中添加了括号,以显示操作的层次结构,但实际上在代码中并不需要它们。)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25674134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档