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

标签 ios swift abrecordref

如何从 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? .

您可以使用 takeRetainedValueUnmanaged 中获取值(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/

相关文章:

ios - 无法更改单元格的行高 - 有 2 个原型(prototype)单元格

ios - 在 Swift 中任意按下更改自定义 UIButton 的 BG 颜色

multithreading - iPhone : address book is erased sometimes

ios - 如何将电子邮件 ID 设置为 ABRecordRef 对象

iOS:exit(0) 是否生成崩溃报告,如果是,还有什么替代方法?

ios - 绘制 UITableView 的单元格会出现视觉错误

ios - 使用 CorePlot 中的 CPTscatterPlotInterpolationCurved 减少超调

ios - UITextView 文本对齐

ios - 如何制作这个 "tape rolling"效果 - Objective C

iphone - 如何获取 ABRecordRef 的所有属性的列表?