当前位置: 首页 > 面试题库 >

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

乐刚毅
2023-03-14
问题内容

我对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。

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


问题答案:

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

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


 类似资料:
  • 我把《算法导论》第3版第22行22.3-13中单连通图的定义引用为。我注意到图中的圈并不一定意味着图不是单连通的,因为包含圈的路径不被认为是简单路径。有向图中的一个简单圈可以由相应的边集唯一地表示。让我们考虑一个满足以下两个性质的有向图: (1)它的DFS林中只有树边和后边,(2)图中表示每个简单圈的集合都是不相交的(即它们不共享任何边)。现在我的问题是:满足以上两个条件的有向图一定是单连通图吗?

  • 问题内容: 如何检查datetime64是否为NaT?我似乎无法从文档中挖掘任何东西。我知道Pandas可以做到,但我不想对如此基本的东西添加依赖。 问题答案: 简介: 这个答案是在Numpy版本为1.11的时候写的,而NAT比较的行为应该从版本1.12开始改变。显然不是这种情况,答案的第二部分就错了。答案的第一部分可能不适用于新版本的numpy。确保已检查以下MSeifert的答案。 第一次进行

  • 我有一个相当简单的情况,我想在我的规则条件中检查一个属性是否为空。 我在调试中跟踪了这一点。正在插入一个Fact,属性为null,但规则仍然会触发。控制台输出如下。 如果我将条件更改为,则规则不会触发。所以它似乎与我所期望的完全相反。 我们确实有一个使用函数的解决方法,但它有点难看,我不明白为什么它首先不起作用。 编辑1 口水版本是5.3.0。 事实是通过另一条规则加载的,该规则使用来自的和服务方

  • 问题内容: 任何人都可以推荐一种 有效的 方法来确定a是否为数学意义上的整数吗? 目前,我有以下代码: …但是希望在必要时避免创建对象的开销。以前,我使用的是如果内部使用紧凑的表示形式则可以避免创建对象,但是如果值太大而无法容纳很长的对象,则显然会失败。 任何帮助表示赞赏。 问题答案: 根据值的来源/用途,首先检查刻度是否小于等于0可能会更快。如果是,那么从数学意义上讲,它绝对是整数。如果是> 0

  • 问题内容: 我需要检查value是否定义为任何东西,包括null。将null值视为undefined并返回。以以下为例: 请注意,这是未定义的。 我需要找到满足以下条件的条件: 有任何想法吗? 问题答案: IIRC,您可以使用此功能:

  • 我试图使用一种方法来检查一个数组列表是否包含一个带有属性的对象。 这是我目前拥有的,但我无法让它发挥作用。