2014-07-10 6 views
14

मैं AddressBook ढांचे से इस समारोह की वापसी मान बदलने की आवश्यकता: प्रकार के एक मूल्य के लिएस्विफ्ट (iOS 8 एसडीके) कन्वर्ट अप्रबंधित <ABMultiValueRef> को ABMultiValueRef

ABRecordCopyValue(nil, kABPersonPhoneProperty) 

ABMultiValueRef

इस समारोह वर्तमान में इस के रूप में चिह्नित किया गया है:

func ABRecordCopyValue(record: ABRecordRef!, property: ABPropertyID) -> Unmanaged<AnyObject>! 

तो मैं तो जैसे अप्रबंधित को रूपांतरित कर सकते हैं:

ABRecordCopyValue(person, kABPersonPhoneProperty) as Unmanaged<ABMultiValueRef> 

लेकिन फिर मैं इसे ABMultiValueRef के रूप में कैसे प्राप्त कर सकता हूं ताकि मैं इसे इस फ़ंक्शन में पास कर सकूं?

func ABMultiValueGetIndexForIdentifier(multiValue: ABMultiValueRef!, identifier: ABMultiValueIdentifier) -> CFIndex 

मैं ऐसा किया:

let managedPhones = Unmanaged.fromOpaque(phones.toOpaque()).takeUnretainedValue() as ABMultiValueRef 

और मैं इस संकलक त्रुटि मिलती रहती है:

Bitcast requires both operands to be pointer or neither 
%89 = bitcast %objc_object* %88 to %PSs9AnyObject_, !dbg !325 
LLVM ERROR: Broken function found, compilation aborted! 
Command /Applications/Xcode6-Beta3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 1 
+0

मुझे एक ही त्रुटि है। मैं बुक रिकॉर्ड्स को क्रमबद्ध करने के साथ फंस गया हूं :( – Anton

+0

मैंने सुना है कि ऐसा इसलिए है क्योंकि ऐप्पल अभी तक नहीं है (आईओएस 8 एसडीके बीटा 4 के रूप में) एड्रेसबुक फ्रेमवर्क पर CF_IMPLICIT_BRIDGING_ENABLED सक्षम है। –

+0

ठीक है, अब मैं समझता हूं :( – Anton

उत्तर

24

मैं समाधान नहीं मिला:

func peoplePickerNavigationController(
    peoplePicker: ABPeoplePickerNavigationController!, 
    didSelectPerson person: ABRecordRef!) { 

    /* Do we know which picker this is? */ 
    if peoplePicker != personPicker{ 
     return 
    } 

    /* Get all the phone numbers this user has */ 
    let unmanagedPhones = ABRecordCopyValue(person, kABPersonPhoneProperty) 
    let phones: ABMultiValueRef = 
    Unmanaged.fromOpaque(unmanagedPhones.toOpaque()).takeUnretainedValue() 
     as NSObject as ABMultiValueRef 

    let countOfPhones = ABMultiValueGetCount(phones) 

    for index in 0..<countOfPhones{ 
     let unmanagedPhone = ABMultiValueCopyValueAtIndex(phones, index) 
     let phone: String = Unmanaged.fromOpaque(
     unmanagedPhone.toOpaque()).takeUnretainedValue() as NSObject as String 

     println(phone) 
    } 
} 
+0

काम करता है, बहुत धन्यवाद! – Aaron

+0

आपका स्वागत है। मुझे खुशी है कि इससे मदद मिली। –

+2

'से ओपेक'/'toOpaque' नृत्य, क्यों न सिर्फ फोन करें: ABMultiValueRef = unmanagedPhones.takeUnretainedValue() 'और' फ़ोन = unmanagedPhone.takeUnretainedValue() स्ट्रिंग के रूप में? – Rob

1

मामले किसी में स्विफ्ट 2 में ABRecords से निपटने के लिए एक अंतिम रास्ता तलाश कर रहा है, यहाँ यह है:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord) { 

    let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() 
    let lastName = ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue() 

    var emails:[String] = [] 
    let emailRecords = ABRecordCopyValue(person, kABPersonEmailProperty).takeRetainedValue() as ABMultiValueRef 
    let emailsCount = ABMultiValueGetCount(emailRecords) 
    for index in 0 ..< emailsCount { 
     if let email = ABMultiValueCopyValueAtIndex(emailRecords, index).takeRetainedValue() as? String { 
      emails.append(email) 
     } 
    } 

    print("Contact selected. firstName: \(firstName), lastName: \(lastName), emails: \(emails)") 

} 
+0

इस तरह की जिंदगी बचाने आर! –

संबंधित मुद्दे