1

我查看了此处的 SE 问题[Avinash 的回答] 和此处的 Apple 资源[第 18 页底部和第 19 页顶部],试图为ABRecord. 我尽力将它们从 Objective-C 翻译过来,但显然我在某处犯了错误,因为在线上let dict = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 5, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)我得到了 error Cannot assign to immutable value of type 'CFDictionaryValueCallBacks'

这是我的代码:

    let information: ABRecord = ABPersonCreate().takeRetainedValue()

    let address: ABMutableMultiValueRef = ABMultiValueCreateMutable(ABPropertyType(kABMultiDictionaryPropertyType)).takeUnretainedValue()

    var keys = [CFStringRef]()
    var values = [CFStringRef]()

    keys.append(kABPersonAddressStreetKey)
    keys.append(kABPersonAddressCityKey)
    keys.append(kABPersonAddressStateKey)
    keys.append(kABPersonAddressZIPKey)
    keys.append(kABPersonAddressCountryKey)
    keys.append(kABPersonAddressCountryCodeKey)

    Note: country code left out

    values.append(s["kABPersonAddressStreetKey"]!! as NSString)
    values.append(s["kABPersonAddressCityKey"]!! as NSString)
    values.append(s["kABPersonAddressStateKey"]!! as NSString)
    values.append(s["kABPersonAddressZIPKey"]!! as NSString)
    values.append(s["kABPersonAddressCountryKey"]!! as NSString)
    values.append(s["kABPersonAddressCountryCodeKey"]!! as NSString)

    let dict = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 5, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)

    let scanned = ABUnknownPersonViewController()

    let identifier = ABMultiValueIdentifier()

    ABMultiValueAddValueAndLabel(address, dict, kABHomeLabel, &identifier)

    ABRecordSetValue(information, kABPersonAddressProperty, address, nil)
4

1 回答 1

1

我确信有一种更简洁的方法可以做到这一点,但这是我想出的解决方案。

 var addressComponents = [String : String]()

    if let value = s["kABPersonAddressStreetKey"] {
        addressComponents[kABPersonAddressStreetKey as String] =  value
    }

    if let value = s["kABPersonAddressCityKey"] {
        addressComponents[kABPersonAddressCityKey as String] = value
    }

    if let value = s["kABPersonAddressStateKey"] {
        addressComponents[kABPersonAddressStateKey as String] = value
    }

    if let value = s["kABPersonAddressZIPKey"] {
        addressComponents[kABPersonAddressZIPKey as String] = value
    }

    if let value = s["kABPersonAddressCountryKey"] {
        addressComponents[kABPersonAddressCountryKey as String] = value
    }

    if let value = s["kABPersonAddressCountryCodeKey"] {
        addressComponents[kABPersonAddressCountryCodeKey as String] = value
    }

    let address: ABMutableMultiValue = ABMultiValueCreateMutable(ABPropertyType(kABMultiStringPropertyType)).takeRetainedValue()
    ABMultiValueAddValueAndLabel(address, addressComponents, kABHomeLabel, nil)
    ABRecordSetValue(information, kABPersonAddressProperty, address, nil)
于 2015-08-11T16:21:43.530 回答