我对iOS开发和Swift相对较新。但是到目前为止,我一直可以通过一些关于stackoverflow的研究以及一些文档和教程来帮助自己。但是,有一个问题我找不到任何解决方案。
我想从用户通讯录中获取一些数据(例如single value属性kABPersonFirstNameProperty)。因为.takeRetainedValue()如果此联系人在通讯录中没有firstName值,则该函数将引发错误,因此我需要确保该ABRecordCopyValue()函数确实返回了一个值。我试图在封闭中检查此:
kABPersonFirstNameProperty
.takeRetainedValue()
ABRecordCopyValue()
let contactFirstName: String = { if (ABRecordCopyValue(self.contactReference, kABPersonFirstNameProperty) != nil) { return ABRecordCopyValue(self.contactReference, kABPersonFirstNameProperty).takeRetainedValue() as String } else { return "" } }()
contactReference 是类型的变量 ABRecordRef!
contactReference
ABRecordRef!
当通讯录联系人提供firstName值时,一切正常。但是,如果没有firstName,则应用程序会由于该.takeRetainedValue()函数而崩溃。似乎if语句没有帮助,因为ABRecordCopyValue()尽管没有firstName,但该函数的非托管返回值不是nil。
我希望我能够弄清楚我的问题。如果有人可以帮助我解决问题,那将是很棒的。
如果要与各种属性关联的值,请使用以下语法:
let first = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String let last = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as? String
或者,您可以使用可选的绑定:
if let first = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String { // use `first` here } if let last = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as? String { // use `last` here }
如果您确实要返回一个非可选的值,其中缺失值为零长度的字符串,则可以使用??运算符:
??
let first = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String ?? "" let last = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as? String ?? ""