从Unmanaged <AnyObject>获取swift类型的值.例如:ABRecordRef

Log*_*gan 23 ios abrecordref swift

如何从类型对象获取Swift类型的值Unmanaged<AnyObject>.我的例子是使用ABRecordRef

我创建了一个联系对象来管理ABRecordRef,但是我在从ObjC翻译时遇到了麻烦.这就是我所拥有的:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

如果是ObjC,我会这样做:

CFTypeRef firstNameRef = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty);
if (firstNameRef) {
    self.firstName = (__bridge NSString *)firstNameRef;
}
Run Code Online (Sandbox Code Playgroud)

我似乎找不到正确的向下转换/转换组合,所以任何帮助都表示赞赏.

Log*_*gan 42

由于NoOne在我解决之前回答了,我将在这里添加答案:

firstName.takeRetainedValue() as? String
Run Code Online (Sandbox Code Playgroud)

如果你看一下Unmanagedstruct类型的标题,你会发现:

/// 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
Run Code Online (Sandbox Code Playgroud)

所以,因为它CFTypeRef被转换为Unmanaged<AnyObject>Swift.

Unmanaged 使用泛型来定义返回类型,并且声明如下:

Unmanaged<T> 
Run Code Online (Sandbox Code Playgroud)

我们的对象是类型Unmanaged<AnyObject>,这意味着takeRetainedValue()将返回类型T,或者在我们的例子中,类型AnyObject.我使用可选的向下转换,因为我的属性firstName是类型String?.

您可以使用该takeRetainedValue方法从Unmanaged对象中获取值.在Foundation API中,我猜测它们大多数都是类型,Unmanaged<AnyObject>!并且需要一个向下转换.通用公式似乎是:

var unmanagedObject: Unmanaged<AnyObject> = someFunctionThatReturnsAnUnmanagedObject()
var newValue: Type = unmanagedObject.takeRetainedValue as Type
Run Code Online (Sandbox Code Playgroud)