IOS Swift 地址簿联系人
IOS Swift AddressBook Contacts
我有一个奇怪的问题,我试图从 IOS 地址簿 API 获取所有联系人,同时我试图获取属性的所有值(名字、姓氏、电子邮件和 phone 我正在获取的每个联系人的号码 "fatal error: unexpectedly found nil while unwrapping an Optional value"),就在我 运行 在我的设备上执行命令时,但是当我在 运行 上执行命令时xcode模拟器一切正常?
这是我的示例代码:
func getContactNames() {
let people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray
for person in people {
let firstName = ABRecordCopyValue(person,
kABPersonFirstNameProperty).takeRetainedValue() as! String
let lastName = ABRecordCopyValue(person,
kABPersonLastNameProperty).takeRetainedValue() as! String
let email: ABMultiValueRef = ABRecordCopyValue(person,kABPersonEmailProperty).takeRetainedValue()
println("First name = \(firstName)")
println("Last name = \(lastName)")
println("Email = \(email)")
}
}
您可能会发现问题出在您对 as! String
的使用上。如果您的地址簿中的任何条目没有名字或姓氏,那么您正试图保留 nil
,因此出现错误。
我对这个问题的解决方案是使用如下代码:
public func stringPropertyValue(record: ABRecord, id:ABPropertyID) -> String! {
var result: String! = nil
if let v = ABRecordCopyValue(record, id) {
result = v.takeRetainedValue() as! String
}
return result
}
你可以这样设置变量:
let firstName = stringPropertyValue(person, id:kABPersonFirstNameProperty)
let lastName = stringPropertyValue(person, id:kABPersonLastNameProperty)
结果变量是隐含的可选值,但它们不会导致解包错误。根据 iOS 9 / Xcode 7
中新的 Contacts 框架,上述函数可以很容易地改造成 class 结构
我有一个奇怪的问题,我试图从 IOS 地址簿 API 获取所有联系人,同时我试图获取属性的所有值(名字、姓氏、电子邮件和 phone 我正在获取的每个联系人的号码 "fatal error: unexpectedly found nil while unwrapping an Optional value"),就在我 运行 在我的设备上执行命令时,但是当我在 运行 上执行命令时xcode模拟器一切正常?
这是我的示例代码:
func getContactNames() {
let people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray
for person in people {
let firstName = ABRecordCopyValue(person,
kABPersonFirstNameProperty).takeRetainedValue() as! String
let lastName = ABRecordCopyValue(person,
kABPersonLastNameProperty).takeRetainedValue() as! String
let email: ABMultiValueRef = ABRecordCopyValue(person,kABPersonEmailProperty).takeRetainedValue()
println("First name = \(firstName)")
println("Last name = \(lastName)")
println("Email = \(email)")
}
}
您可能会发现问题出在您对 as! String
的使用上。如果您的地址簿中的任何条目没有名字或姓氏,那么您正试图保留 nil
,因此出现错误。
我对这个问题的解决方案是使用如下代码:
public func stringPropertyValue(record: ABRecord, id:ABPropertyID) -> String! {
var result: String! = nil
if let v = ABRecordCopyValue(record, id) {
result = v.takeRetainedValue() as! String
}
return result
}
你可以这样设置变量:
let firstName = stringPropertyValue(person, id:kABPersonFirstNameProperty)
let lastName = stringPropertyValue(person, id:kABPersonLastNameProperty)
结果变量是隐含的可选值,但它们不会导致解包错误。根据 iOS 9 / Xcode 7
中新的 Contacts 框架,上述函数可以很容易地改造成 class 结构