如何从Unmanaged<AnyObject>
类型的对象中获取Swift类型的值?我的示例使用ABRecordRef
我正在创建一个联系人对象,以便在获得ABRecordRef
后进行管理,但在从ObjC转换时遇到了问题。这是我的资料
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;
}
我似乎找不到正确的组合向下/转换,所以任何帮助是赞赏。
3条答案
按热度按时间tpxzln5u1#
由于在我解决之前没有人回答,我将在这里添加答案:
如果你查看
Unmanaged
结构类型的头文件,你会发现:所以,因为
CFTypeRef
在Swift中被转换为Unmanaged<AnyObject>
。Unmanaged
使用泛型来定义返回类型,声明如下:我们的对象的类型是
Unmanaged<AnyObject>
,这意味着takeRetainedValue()
将返回类型T
,或者在我们的例子中,返回类型AnyObject
。我使用可选的向下转换,因为我的属性firstName
是String?
类型。您可以使用
takeRetainedValue
方法从Unmanaged
对象中获取值。在基础API中,我猜它们大多数是Unmanaged<AnyObject>!
类型,并且需要向下转换。通式似乎是:zpf6vheq2#
}
k97glaaz3#