2015-08-11 9 views
1

Я попытался установить адрес ABRecord на вопрос SE here [ответ Авинаша] и ресурс Apple here [внизу страницы 18 и в начало страницы 19]. Я сделал все возможное, чтобы перевести их из Objective-C, но, видимо, я ошибся где-то, так как на линии let dict = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 5, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) я получаю ошибку Cannot assign to immutable value of type 'CFDictionaryValueCallBacks'.Swift: Set Address Свойство ABRecord

Вот мой код:

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) 
+0

В мире NSDictionary намного легче работать, чем в мире CFDictionary. Здесь абсолютно ничего не нужно, кроме NSDictionary. Просто создайте словарь в обычном Swift. – matt

+0

@matt Привет, спасибо за подсказку. Я попробовал 'let dict: NSDictionary = [kABPersonAddressStreetKey: s [" kABPersonAddressStreetKey "] !! как NSString, ... ', но получил сообщение о том, что не было перегрузки для индекса, который принимает следующие аргументы. Могли бы вы или кто-либо еще предоставить небольшой пример кода о том, как реализовать свое предложение? – Randoms

+0

Что такое '' '? Похоже, что это уже словарь, который вы хотите. – matt

ответ

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)