我不确定这是否属于 Stack Overflow,如果不属于,请告诉我。
我有这段代码将联系人添加到数组中,如果数组中已存在具有该电话/姓名组合的联系人,则不会再次添加它(意味着没有重复项)。
它按预期工作,但它大大增加了构建时间,我正在寻找更好的使用方法contains
或其他一些方法。
var contacts = [CNContact]()
let name: String = contact.givenName + " " + contact.middleName + " " + contact.familyName
if (name.stringByReplacingOccurrencesOfString(" ", withString: "")).length > 1
{
if contact.phoneNumbers.count > 0
{
// Check if contacts already contains name/phone combination
if let phoneNumber: String = (contact.phoneNumbers[0].value as? CNPhoneNumber)?.stringValue
{
if contacts.contains({$0.phoneNumbers.count > 0 && ($0.phoneNumbers[0].value as? CNPhoneNumber)?.stringValue == phoneNumber}) &&
contacts.contains({($0.givenName + " " + $0.middleName + " " + $0.familyName) == name})
{ /* Contact with same name/phone combination already exists in array */ }
else { contacts.append(contact) }
}
}
}
Chained +
根据我的经验,这是构建时间缓慢的最常见原因。当人们抱怨构建时间时,我总是问“你已经被束缚了+,不是吗?”大约90%是正确的。例如:
let name: String = contact.givenName + " " + contact.middleName + " " + contact.familyName
and also
contacts.contains({($0.givenName + " " + $0.middleName + " " + $0.familyName) == name})
使用插值而不是链式+:
"\(contact.givenName) \(contact.middleName) \(contact.familyName)"
或者加入一个数组:
[contact.givenName, contact.middleName, contact.familyName].joined(separator: " ")
在这种特殊情况下,我几乎肯定会做一个帮手:
extension Contact {
var fullName: String {
return "\(contact.givenName) \(contact.middleName) \(contact.familyName)"
}
}
那么其余的大部分代码都会变得更简单。
链式的问题+
是它有很多重载,因此编译器必须对所有不同版本进行组合爆炸性搜索+
它可能会用在这里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)