【问题标题】:Accessing a contact detail in iOS using swift使用 swift 在 iOS 中访问联系人详细信息
【发布时间】:2014-07-23 04:57:30
【问题描述】:

在使用 Objective-C 时,我们通常使用以下代码来获取详细信息

NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);

在 Swift 中我尝试了以下方法

var firstName : NSString = ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty).takeUnretainedValue() as NSString

由于错误,我无法构建

Bitcast 要求两个操作数都是指针或两者都不是 %224 = bitcast %objc_object* %223 到 %PSs9AnyObject_, !dbg !486 Bitcast 要求两个操作数都是指针或两者都不是 %225 = 比特广播 %PSs9AnyObject_ %224 到 i8*, !dbg !486 LLVM 错误:发现损坏的函数,编译中止! 命令 /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 失败,退出代码为 1

【问题讨论】:

    标签: ios nsstring swift abaddressbook


    【解决方案1】:

    这适用于 Xcode 6 GM

    let firstName = ABRecordCopyValue(contactRecord, kABPersonFirstNameProperty).takeRetainedValue() as String
    

    比上面的例子稍微简洁一些。

    【讨论】:

    • 你怎么知道是takeRetainedValue()而不是unretained。上一个答案使用未保留。
    • 找不到太多关于此的信息,但我假设您在指针由您管理时使用 takeUnretainedValue()(例如,从名称中带有 CreateCopy 的函数返回) - 这将使他们的保留计数增加一。另一方面,当您使用名称中带有 Get 或类似名称的方法的结果时,您将使用 takeRetainedValue(),因为它们已经拥有一个订单的保留计数,以使它们在方法的生命周期内保持活跃。
    • 更新到我之前的评论: 找不到有关此的太多信息,但我假设您在指针由您管理时使用 takeRetainedValue()(例如返回来自名称中带有CreateCopy 的函数) - 这不会将其保留计数增加一。 另一方面当您使用名称中带有Get 或类似名称的方法的结果时,您将使用takeUnretainedValue(),因为它们的保留计数已经为零。
    【解决方案2】:

    以下在 Xcode6 beta 4 中运行良好。

    var firstName: NSString! = Unmanaged<CFString>.fromOpaque(ABRecordCopyValue(record, kABPersonFirstNameProperty).toOpaque()).takeUnretainedValue().__conversion()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2012-02-21
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多