如何从 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;
}
我似乎找不到向下转换/转换的正确组合,因此不胜感激。
最佳答案
由于在我解决之前没有人回答,我将在此处添加答案:
firstName.takeRetainedValue() as? String
如果您查看 Unmanaged
的标题结构类型,你会发现这个:
/// 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>
在 swift 。
Unmanaged
使用泛型来定义一个返回类型,它是这样声明的:
Unmanaged<T>
我们的对象类型是Unmanaged<AnyObject>
这意味着 takeRetainedValue()
将返回类型 T
,或者在我们的例子中,输入 AnyObject
.我使用可选的向下转型,因为我的属性(property) firstName
类型为 String?
.
您可以使用 takeRetainedValue
从 Unmanaged
中获取值(value)的方法目的。在 Foundation API 中,我猜测它们大多属于 Unmanaged<AnyObject>!
类型。并且需要沮丧。通用公式似乎是:
var unmanagedObject: Unmanaged<AnyObject> = someFunctionThatReturnsAnUnmanagedObject()
var newValue: Type = unmanagedObject.takeRetainedValue as Type
关于ios - 从 Unmanaged<AnyObject> 获取 swift 类型的值。例如 : ABRecordRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25984827/