Swift Array包含的函数使构建时间变长

时间:2016-11-11 21:47:29

标签: arrays swift

我不确定这是否属于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) }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

链接+是我体验中构建时间慢的最常见原因。当人们抱怨建立时间时,我总是问“你有链接+,不是你。”大概是90%左右。例如:

let name: String = contact.givenName + " " + contact.middleName + " " + contact.familyName

以及

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)"
    }
}

然后你的其余代码会变得更简单。

链接+的问题在于它有很多重载,所以编译器必须对它可能在这里使用的+的所有不同版本进行组合爆炸式搜索。