小编典典

Swift-检查非托管通讯簿单值属性是否为nil

swift

我对iOS开发和Swift相对较新。但是到目前为止,我一直可以通过一些关于stackoverflow的研究以及一些文档和教程来帮助自己。但是,有一个问题我找不到任何解决方案。

我想从用户通讯录中获取一些数据(例如single
value属性kABPersonFirstNameProperty)。因为.takeRetainedValue()如果此联系人在通讯录中没有firstName值,则该函数将引发错误,因此我需要确保该ABRecordCopyValue()函数确实返回了一个值。我试图在封闭中检查此:

let contactFirstName: String = {
   if (ABRecordCopyValue(self.contactReference, kABPersonFirstNameProperty) != nil) {
      return ABRecordCopyValue(self.contactReference, kABPersonFirstNameProperty).takeRetainedValue() as String
   } else {
      return ""
   }
}()

contactReference 是类型的变量 ABRecordRef!

当通讯录联系人提供firstName值时,一切正常。但是,如果没有firstName,则应用程序会由于该.takeRetainedValue()函数而崩溃。似乎if语句没有帮助,因为ABRecordCopyValue()尽管没有firstName,但该函数的非托管返回值不是nil。

我希望我能够弄清楚我的问题。如果有人可以帮助我解决问题,那将是很棒的。


阅读 247

收藏
2020-07-07

共1个答案

小编典典

如果要与各种属性关联的值,请使用以下语法:

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 ?? ""
2020-07-07