2016-09-19 3 views
3

Итак, я только что обновился до Xcode 8 и преобразовал мой код Swift 2.3 в Swift 3, и у меня есть ошибка в этой строке кода, которая не была в Swift 2.3:ABAddressBook fromOpaque (_ :) в Swift 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), который я использую сейчас.

Как это сделать?

+1

Несвязанный, но если вы программируете в Swift 3, вы можете просто использовать структуру контактов, что намного проще, чем старый ABAddressBook ... – Rob

ответ

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 осуждались в прошивке 9, вы можете использовать Контакты рамку :

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) 
    } 
} 
+0

Первый ответ, спасибо! –