共通キーのない辞書のマージ
まず、共通のキーを持たない2つの辞書をマージする方法を見てみましょう:
let dict1 = ["name": "Swift", "version": "5.3"]
let dict2 = ["platform": "iOS"]
let total = dict1.merging(dict2) { (first, _) -> String in return first }
print(total) // ["name": "Swift", "version": "5.3", "platform": "iOS"]
totalのキーと値のペアがdict1とdict2の合計であることがわかります。
共通キーによる辞書のマージ
次に、共通のキーを持つ辞書をマージする方法を見てみましょう。共通のキーがある場合、1つ目の辞書の値を使う場合と、2つ目の辞書の値を使う場合があります。そこで最初の登場です。
最初の辞書値を使用
let dict1 = ["name": "Swift", "version": "5.3"]
let dict2 = ["name": "OC"]
let total = dict1.merging(dict2) { (first, _) -> String in return first }
print(total) // ["name": "Swift", "version": "5.3"]
つ目の辞書の値を使用
let dict1 = ["name": "Swift", "version": "5.3"]
let dict2 = ["name": "OC"]
let total = dict1.merging(dict2) { (_, second) -> String in return second }
print(total) // ["name": "OC", "version": "5.3"]
2つ目の辞書の値を使用する場合、上記のコードは構文糖を使用して、以下のバージョンに簡素化することもできます:
let total = dict1.merging(dict2) { $1 }
エクステンション
この関数は、どの辞書の値が使用されるかを制御するだけでなく、共通値の後に文字列をスプライスするなど、クロージャにロジックを追加します。
let dict1 = ["name": "Swift", "version": "5.3"]
let dict2 = ["name": "OC", "version": "2.0", "platform":"iOS"]
let total = dict1.merging(dict2) { (current, _) in
return current + " common"
}
print(total) // ["platform": "iOS", "name": "Swift common", "version": "5.3 common"]
理由と理由を知る
上記の例で、その使い方はマスターできたと思いますが、次はその実装を想定してみましょう:
- 非共有キー、値を結果に追加
- 共有キーと値を組み合わせて得られる戻り値を結果に追加します。
extension Dictionary {
func customMergeing(other: Dictionary, combine: (_ v1: Value, _ v2: Value) -> Value) -> [Key: Value] {
var result = self
// 異なるキーを見つけ、対応する値を結果に加える。
let key1 = Set(self.keys)
let key2 = Set(other.keys)
let diff = key2.subtracting(key1)
for key in diff {
result[key] = other[key]
}
// 同じキーを見つけ、その値を結果に加える。
let common = key1.intersection(key2)
for key in common {
result[key] = combine(self[key]!, other[key]!)
}
return result
}
}
上記のコードは、マージ関数の私自身の実装であり、以下のコードを通してネイティブ関数のパフォーマンスを測定したところ、カスタム関数()の約30倍でした。以下はテストコードです:
let dict1 = ["name": "Swift", "version": "5.3", "a": "b", ]
let dict2 = ["name": "OC", "version": "2.0", "platform":"iOS"]
func test1() {
let begin = CACurrentMediaTime()
for _ in 0...num {
let _ = dict1.merging(dict2) { (current, _) in current + "common" }
}
let end = CACurrentMediaTime()
print(end - begin)
}
func test2() {
let begin = CACurrentMediaTime()
for _ in 0...num {
let _ = dict1.customMergeing(other: dict2) { (current, _) in current + "common" }
}
let end = CACurrentMediaTime()
print(end - begin)
}
test1() // 0.
test2() //
この記事が、Swiftコーディングのスリルをより楽しむためのいくつかの洞察をあなたに与えたことを願っています。