2014-09-22 3 views
17

Unmanaged<AnyObject>의 개체에서 Swift 형식으로 값을 가져 오는 방법은 무엇입니까? 내 예 : ABRecordRef비 관리 형 <AnyObject>에서 신속 유형으로 값을 가져옵니다. 예 : ABRecordRef

ABRecordRef을 얻으면 관리 할 연락처 개체를 만들고 있지만 ObjC에서 번역하는 데 문제가 있습니다.

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

내가 downcasting/변환의 오른쪽 조합을 찾을 수 없습니다, 그래서 어떤 도움에 감사드립니다 : 그것은 ObjC라면

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

    } 
} 

, 내가 할 것 : 여기있는거야.

답변

33

나는 그것을 해결하기 전에 아무도 대답 때문에, 내가 여기에 대답 추가 할 것입니다 : 당신이 Unmanaged 구조체 형식의 헤더를 보면

firstName.takeRetainedValue() as? String 

, 당신이 확인할 수있는 것들 :

/// 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 

스위프트에서 CFTypeRefUnmanaged<AnyObject>으로 변환 되었기 때문에.

Unmanaged는 반환 유형을 정의하기 위해 제네릭을 사용하고, 그것은과 같이 선언 :

Unmanaged<T> 

우리의 목적은 takeRetainedValue() 유형 T, 또는 우리의 경우, 유형 AnyObject을 반환한다는 것을 의미 유형 Unmanaged<AnyObject>이다. 내 부동산 firstNameString?이므로 선택적 다운 캐스트를 사용합니다.

takeRetainedValue 메서드를 사용하면 Unmanaged 개체에서 값을 얻을 수 있습니다. Foundation API에서는 대부분 형식이 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

답변 해 주셔서 감사합니다! 그것은 나를 도왔다! –