Swift(iOS 8 SDK)将非托管<ABMultiValueRef>转换为ABMultiValueRef

Van*_*oor 14 unmanaged abrecordcopyvalue swift

我需要从AddressBook框架转换此函数的返回值:

ABRecordCopyValue(nil, kABPersonPhoneProperty)
Run Code Online (Sandbox Code Playgroud)

到ABMultiValueRef类型的值

此功能目前标记为:

func ABRecordCopyValue(record: ABRecordRef!, property: ABPropertyID) -> Unmanaged<AnyObject>!
Run Code Online (Sandbox Code Playgroud)

所以我可以将它转换为Unmanaged,如下所示:

ABRecordCopyValue(person, kABPersonPhoneProperty) as Unmanaged<ABMultiValueRef>
Run Code Online (Sandbox Code Playgroud)

但是,我怎样才能将它作为ABMultiValueRef,以便我可以将它传递给这个函数?

func ABMultiValueGetIndexForIdentifier(multiValue: ABMultiValueRef!, identifier: ABMultiValueIdentifier) -> CFIndex
Run Code Online (Sandbox Code Playgroud)

我这样做了:

let managedPhones = Unmanaged.fromOpaque(phones.toOpaque()).takeUnretainedValue() as ABMultiValueRef
Run Code Online (Sandbox Code Playgroud)

我一直收到这个编译错误:

Bitcast requires both operands to be pointer or neither
%89 = bitcast %objc_object* %88 to %PSs9AnyObject_, !dbg !325
LLVM ERROR: Broken function found, compilation aborted!
Command /Applications/Xcode6-Beta3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 1
Run Code Online (Sandbox Code Playgroud)

Van*_*oor 25

我找到了解决方案:

func peoplePickerNavigationController(
  peoplePicker: ABPeoplePickerNavigationController!,
  didSelectPerson person: ABRecordRef!) {

    /* Do we know which picker this is? */
    if peoplePicker != personPicker{
      return
    }

    /* Get all the phone numbers this user has */
    let unmanagedPhones = ABRecordCopyValue(person, kABPersonPhoneProperty)
    let phones: ABMultiValueRef =
    Unmanaged.fromOpaque(unmanagedPhones.toOpaque()).takeUnretainedValue()
      as NSObject as ABMultiValueRef

    let countOfPhones = ABMultiValueGetCount(phones)

    for index in 0..<countOfPhones{
      let unmanagedPhone = ABMultiValueCopyValueAtIndex(phones, index)
      let phone: String = Unmanaged.fromOpaque(
        unmanagedPhone.toOpaque()).takeUnretainedValue() as NSObject as String

      println(phone)
    }  
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是`fromOpaque` /`toOpaque`舞,为什么不只是做'让手机:ABMultiValueRef = unmanagedPhones.takeUnretainedValue()`和`让phone = unmanagedPhone.takeUnretainedValue()为String`? (2认同)
  • 这是Beta 5修复程序.Apple已经解决了这个问题,因此无需进行所有非托管业务. (2认同)