Ios Swift:设置ABRecord的地址属性
我查看了SE问题[阿维纳什的答案]和苹果资源[第18页底部和第19页顶部],试图为Ios Swift:设置ABRecord的地址属性,ios,swift,abaddressbook,abrecord,abmultivalue,Ios,Swift,Abaddressbook,Abrecord,Abmultivalue,我查看了SE问题[阿维纳什的答案]和苹果资源[第18页底部和第19页顶部],试图为ABRecord设置地址。我尽了最大努力从Objective-C中翻译它们,但显然我在某处犯了一个错误,因为在let dict=CFDictionaryCreate(kCFAllocatorDefault,key,values,5,&kCFCopyStringDictionaryKeyCallBacks,&kCFTypeDictionaryValueCallBacks)一行中我得到一个错误无法分配给“CFDicti
ABRecord
设置地址。我尽了最大努力从Objective-C中翻译它们,但显然我在某处犯了一个错误,因为在let dict=CFDictionaryCreate(kCFAllocatorDefault,key,values,5,&kCFCopyStringDictionaryKeyCallBacks,&kCFTypeDictionaryValueCallBacks)一行中
我得到一个错误无法分配给“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)
我相信有一种更简洁的方法可以做到这一点,但我想出了一个解决方案
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)
您会发现在NSDictionary世界而不是CFDictionary世界中工作要容易得多。这里绝对不需要任何东西,只需要一本字典。用普通的Swift格式就可以了。@matt嗨,谢谢你的提示。我尝试了
让dict:NSDictionary=[kABPersonAddressStreetKey:s[“kABPersonAddressStreetKey”]!!作为NSString,
,但出现一个错误,指出接受以下参数的下标没有重载。您或其他任何人是否可以提供一个小示例代码来说明如何实现您的建议?什么是s
?它看起来已经是您想要的字典了。@matt它是一个常规的(不是NS)类型为[字符串:字符串?]的字典,除了地址之外,它还保存了更多的信息。此外,键的类型为String,而不是ABProperty,因此我不确定它是否可以不经修改地工作。好吧,让我直说。您在基于s
构建字典时遇到了问题。您希望有人帮助您解决此问题,以便您的代码能够编译。但您没有您是否愿意展示s
实际上是什么?