2017-10-25 23 views
0

ArrayValueの値を追加するには、Swiftの値をDictionaryに追加するのが最善の方法です。彼らの名の最初の文字でソートされた連絡先の辞書を作りたいと思います。たとえば、[A:[アーロン、アダム、等...]、B:[ブライアン、ブルターニュ、電気ショック療法...]、...]辞書に項目を追加する

私はこの機能が見つかりました:

updateValue(_:forKey:)

そして、ループの中でそれを使用してみました:

​​

をしかし、私はそれが新しいものと既存のアレイを置き換えることを使用しようとしたとき。辞書のキーが存在するかどうかを手動でチェックして配列を取得してから新しい値を追加し、そうでない場合は新しいキーと値のペアを追加することができますが、Swiftが、これを行うより良い方法。

洞察力があれば幸いです!

答えて

3

あなたはreduce(into:)方法(Swift4)を使用し、次のようにすることができます

let contacts = ["Aaron", "Adam", "Brian", "Brittany", ""] 
let dictionary = contacts.reduce(into: [String:[String]]()) { result, element in 
    // make sure there is at least one letter in your string else return 
    guard let first = element.first else { return } 
    // create a string with that initial 
    let initial = String(first) 
    // initialize an array with one element or add another element to the existing value 
    result[initial] = (result[initial] ?? []) + [element] 
} 
print(dictionary) // ["B": ["Brian", "Brittany"], "A": ["Aaron", "Adam"]] 

あなたがSwift3以前を使用している場合は、クロージャ内で可変の結果辞書を作成する必要があります:

let contacts = ["Aaron", "Adam", "Brian", "Brittany", ""] 
let dictionary = contacts.reduce([String:[String]]()) { result, element in 
    var result = result 
    guard let first = element.first else { return result } 
    let initial = String(first) 
    result[initial] = (result[initial] ?? []) + [element] 
    return result 
} 
print(dictionary) // ["B": ["Brian", "Brittany"], "A": ["Aaron", "Adam"]] 

結果がソートされないことに注意してください。辞書は順序付けられていないコレクションです。

let sorted = dictionary.sorted {$0.key < $1.key} 
print(sorted) 

「[(キー: 『A』、値:[」アーロン、あなたの辞書をソートし(キー、値)の配列を返す必要がある場合は、次のようにキーでソート使用することができタプル" "アダム"])、(キー: "B"、値:[ "ブライアン"、 "ブルターニュ"])] \ n" は

0

スウィフト4の新しい辞書初期化子があなたのためにそれをすべて行うことができます。

let contactInitials = contacts.filter{!$0.isEmpty}.map{ ($0.first!,[$0]) } 
let dict = [Character:[String]](contactInitials, uniquingKeysWith:+) 
+0

はい、ただし、文字プロパティにアクセスする必要はありません。 –

+1

Tru e、古い習慣は激しく死ぬ。 –

+0

そして、これにはすべての要素に少なくとも1つの文字が必要です –

関連する問題