3

所以我刚刚更新到 Xcode 8 并将我的 Swift 2.3 代码转换为 Swift 3,我在这行代码中有一个错误,它不在 Swift 2.3 中:

func populateFrom(_ addressBook:ABAddressBook)
{
    let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
    let nPeople = ABAddressBookGetPersonCount(addressBook)
    for index in 0..<nPeople
    {
       let person:ABRecord = Unmanaged<ABRecord>.fromOpaque(OpaquePointer(CFArrayGetValueAtIndex(allPeople, index))).takeUnretainedValue()
    }
}

现在问题就出来了let person:ABRecord = Unmanaged<ABRecord>.fromOpaque(OpaquePointer(CFArrayGetValueAtIndex(allPeople, index))).takeUnretainedValue()

Xcode 告诉我'fromOpaque' is unavailable: use 'fromOpaque(_:UnsafeRawPointer)' instead。但是我找不到 Xcode 告诉我使用的功能,我只能找到fromOpaque(value: UnsafeRawPointer)我当前正在使用的功能。

我怎样才能使这项工作?

4

1 回答 1

3

您可以稍微简化一下,消除所有那些不透明的指针引用,例如:

func populate(from addressBook: ABAddressBook) {
    let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as [ABRecord]
    for person in allPeople {
        let name = ABRecordCopyCompositeName(person).takeRetainedValue()
        print(name)
    }
}

或者,鉴于 AddressBook 框架在 iOS 9 中已被弃用,您可以使用 Contacts 框架:

let store = CNContactStore()
store.requestAccess(for: .contacts) { granted, error in
    guard granted else {
        print(error)
        return
    }

    self.populate(from: store)
}

func populate(from store: CNContactStore) {
    let formatter = CNContactFormatter()
    formatter.style = .fullName

    let request = CNContactFetchRequest(keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: formatter.style)])
    do {
        try store.enumerateContacts(with: request) { contact, stop in
            print(formatter.string(from: contact))
        }
    } catch {
        print(error)
    }
}
于 2016-09-19T20:58:33.107 回答