我正试图用斯威夫特获得一份具有特定名字的联系人名单。我有以下代码:
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)。
是什么引起了这个问题?
发布于 2014-09-04 22:58:14
Unmanaged和Opaque类型比必要的要多得多。你的台词:
var addressBookRef: ABAddressBookRef =ABAddressBookRef
相当于:
var addressBookRef = addressBook.takeUnretainedValue()
(此外,您应该使用let,除非您希望为该变量赋值,这似乎是不可能的。优化器将感谢您。)ABAddressBookCopyPeopleWithName在我的测试中返回一个非空数组,即使使用ObjC也是如此,所以很难说。ABAddressBookCopyArrayOfAllPeople代替,但返回数组的用法相同):
设addressBook: ABAddressBook = ABAddressBookCreateWithOptions(nil,nil).takeRetainedValue() allContacts =.takeRetainedValue println("All Contact:(allContacts)")
(大概是在获取addressBook和使用它之间的某个时候,您要么检查ABAddressBookGetAuthorizationStatus(),要么调用ABAddressBookRequestAccessWithCompletion,对吗?)ABRecord值,则需要进行一些转换。CoreFoundation类型桥接到基金会类型,基础数组桥接到Swift数组,但它并不能自动地从CF连接到Swift。
((allContacts as NSArray) as ABRecord) { let name =NSArray(Name)}
(我在该for语句中添加了括号,以显示操作的层次结构,但实际上在代码中并不需要它们。)https://stackoverflow.com/questions/25674134
复制相似问题