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)
| 归档时间: |
|
| 查看次数: |
8356 次 |
| 最近记录: |