2016-11-11 3 views
0

これはスタックオーバーフローに属しているかどうかわかりませんが、わからない場合はお知らせください。Swift Arrayにはビルド時間を長くする関数が含まれています

配列に連絡先を追加するこのコードは、電話/名前の組み合わせの連絡先がすでに配列に存在する場合には、再度追加しません(重複しないことを意味します)。

これは意図したとおりに動作しますが、ビルド時間が劇的に増え、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

は、私の経験では遅いビルド時間の最も一般的な原因です。人々がビルド時間について不平を言う時、私はいつも「あなたは鎖を結んだ+、あなたはしていない」と尋ねる。右に約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)" 
    } 
} 

その後、コードの残りの部分がより簡単になります。

+の問題は、オーバーロードが多く、コンパイラは+のすべてのバージョンの組み合わせを爆発的に検索する必要があることです。

+0

おかげでビルド時間は約1/3に短縮されました。これを知っていれば、あなたは鎖の文字列に "+"を使用するでしょうか? – ohr

+0

私は決して '+'を使用して文字列を結合しません。コンパイルに時間がかかるだけでなく、中間オブジェクトを作成する必要があるため、効率的ではありません。 –

関連する問題