2016-09-19 5 views
3

이제 Xcode 8로 업데이트하고 Swift 2.3 코드를 Swift 3으로 변환했습니다. Swift 2.3에 포함되지 않은이 코드 줄에는 오류가 있습니다.ABAddressBook fromOpaque fromOpaque (_ :) in 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()

엑스 코드가 'fromOpaque' is unavailable: use 'fromOpaque(_:UnsafeRawPointer)' instead 하더군요 라인입니다. 하지만 Xcode가 사용법을 알려주고 있다는 것을 알 수는 없지만 현재 사용중인 fromOpaque(value: UnsafeRawPointer)을 찾을 수 있습니다.

어떻게하면됩니까? 주소록 프레임 워크는 아이폰 OS 9에서 사용되지 않습니다 주어진

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

또는, 당신은 연락처 프레임 워크를 사용할 수 있습니다

+1

관련이 없지만 Swift 3에서 프로그래밍하는 경우 이전 ABAddressBook보다 훨씬 쉬운 연락처 프레임 워크를 사용하는 것이 좋습니다. – Rob

답변

3

당신은 예를 들어, 그 불투명 한 포인터 참조를 모두 제거,이 조금 단순화 할 수 있습니다 :

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

첫 번째 답변이 감사했습니다. –