2014-09-22 6 views
17

मुझे Unmanaged<AnyObject> प्रकार की ऑब्जेक्ट से स्विफ्ट प्रकार के रूप में मूल्य कैसे प्राप्त करें। मेरा उदाहरण ABRecordRefअप्रबंधित <AnyObject> से त्वरित प्रकार के रूप में मूल्य प्राप्त करें। उदाहरण के लिए: ABRecordRef

मैं ABRecordRef प्राप्त करने के बाद एक संपर्क ऑब्जेक्ट बना रहा हूं, लेकिन मुझे ओबीजेसी से अनुवाद करने में समस्या हो रही है। यहाँ मैं क्या है:

init(recordRef: ABRecordRef) { 
    if let firstName = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty) { 
     self.firstName = firstName 

    } 
} 

यदि यह ObjC थे, मुझे क्या करना होगा:

CFTypeRef firstNameRef = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty); 
if (firstNameRef) { 
    self.firstName = (__bridge NSString *)firstNameRef; 
} 

मैं downcasting/रूपांतरण का सही संयोजन खोजने के लिए नहीं कर पा रहे हैं, इसलिए किसी भी मदद की सराहना की है।

उत्तर

33

के बाद से नूने जवाब इससे पहले कि मैं इसे हल है, मैं इस सवाल का जवाब यहाँ जोड़ देंगे:

firstName.takeRetainedValue() as? String 

आप Unmanaged struct प्रकार के शीर्षक को देखो, तो आप इस मिल जाएगा:

/// Get the value of this unmanaged reference as a managed 
/// reference and consume an unbalanced retain of it. 
/// 
/// This is useful when a function returns an unmanaged reference 
/// and you know that you're responsible for releasing the result. 
func takeRetainedValue() -> T 

इसलिए, क्योंकि CFTypeRef को स्विफ्ट में Unmanaged<AnyObject> में परिवर्तित कर दिया गया है।

Unmanaged एक वापसी प्रकार परिभाषित करने के लिए जेनरिक का उपयोग करता है, और यह बहुत की तरह घोषित किया जाता है:

Unmanaged<T> 

हमारे ऑब्जेक्ट प्रकार Unmanaged<AnyObject> जिसका अर्थ है कि takeRetainedValue() वापस आ जाएगी प्रकार T, या हमारे मामले में, प्रकार AnyObject की है। मैं वैकल्पिक डाउनकास्टिंग का उपयोग करता हूं क्योंकि मेरी संपत्ति firstNameString? प्रकार है।

आप अपने Unmanaged ऑब्जेक्ट से अपना मूल्य प्राप्त करने के लिए takeRetainedValue विधि का उपयोग कर सकते हैं। फाउंडेशन एपीआई में, मुझे लगता है कि वे ज्यादातर Unmanaged<AnyObject>! टाइप करेंगे और एक डाउनकास्ट की आवश्यकता होगी। सामान्य सूत्र प्रतीत होता है:

var unmanagedObject: Unmanaged<AnyObject> = someFunctionThatReturnsAnUnmanagedObject() 
var newValue: Type = unmanagedObject.takeRetainedValue as Type 
3
import UIKit 
import AddressBook 

class ViewController: UIViewController { 

lazy var addressBook: ABAddressBookRef = { 
    var error: Unmanaged<CFError>? 
    return ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() as ABAddressBookRef 
}() 

@IBAction func GetPeople(sender: UIButton) { 
    var ab: ABAddressBookRef = addressBook 

    switch ABAddressBookGetAuthorizationStatus(){ 
    case .Authorized: 
     println("Authorized") 
     readFromAddressBook(addressBook) 
    case .Denied: 
     println("Denied") 
    case .Restricted: 
     println("Restricted") 
    case .NotDetermined: 
     println("Not determined") 
     ABAddressBookRequestAccessWithCompletion(addressBook, 
      {[weak self] (granted: Bool, error: CFError!) in 
       if granted { 
        let strongSelf = self! 
        println("Access is granted") 
        strongSelf.readFromAddressBook(strongSelf.addressBook) 
       } 
       else{ 
        println("Access is not granted") 
       } 
     }) 
    default: 
     break 
    } 
} 

func readFromAddressBook(addressBook: ABAddressBookRef){ 
    let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 

    for person:ABRecordRef in allPeople{ 
     if let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty) { 
      if let lastName = ABRecordCopyValue(person, kABPersonLastNameProperty) { 
       let ln:String = (lastName.takeRetainedValue() as? String) ?? "" 
       let fn:String = (firstName.takeRetainedValue() as? String) ?? "" 
       println("\(ln) - \(fn)") 
      } 
     } 
    } 
} 

}

+3

में आपका स्वागत है स्टैक ओवरफ़्लो के लिए! उत्तर सबसे उपयोगी होते हैं जब उनमें प्रश्न की समस्या के समाधान का स्पष्टीकरण होता है। क्या आप कुछ और विवरण जोड़ने के लिए [अपनी पोस्ट संपादित कर रहे हैं] (http://stackoverflow.com/posts/28975435/edit) पर विचार करेंगे? –

+0

आपके उत्तर के लिए धन्यवाद! यह मेरी मदद की है! –

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