Swift 将项作为字典值添加到数组中

Swift 将项作为字典值添加到数组中,swift,Swift,我正试图找出在Swift中向数组添加值的最佳方法,该数组是字典中的值。我想建立一个按联系人名字的第一个字母排序的联系人字典。例如[A:[Aaron,Adam,etc…],B:[Brian,Brittany,etc…],] 我发现这个函数: updateValue(\uuuquokey:) 并尝试在循环中使用它: for contact in self.contacts.sorted() { self.contactDictionary.updateValue([contact], for

我正试图找出在
Swift
中向
数组添加值的最佳方法,该数组是
字典中的
值。我想建立一个按联系人名字的第一个字母排序的联系人字典。例如[A:[Aaron,Adam,etc…],B:[Brian,Brittany,etc…],]

我发现这个函数:

updateValue(\uuuquokey:)

并尝试在循环中使用它:

for contact in self.contacts.sorted() {
    self.contactDictionary.updateValue([contact], forKey: String(describing: contact.characters.first))           
}
但是当我尝试使用它时,它用一个新的数组替换了现有的数组。我知道我可以手动检查字典中的键是否存在,如果存在,则检索数组,然后附加新值,否则添加新的键/值对,但我不确定Swift是否提供了一种更简单/更好的方法

任何见解都将不胜感激

您可以使用
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"]]
let sorted = dictionary.sorted {$0.key < $1.key}
print(sorted)

如果使用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 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"]]
let sorted = dictionary.sorted {$0.key < $1.key}
print(sorted)
let sorted=dictionary.sorted{$0.key<$1.key}
打印(已排序)
[(键:“A”,值:[“亚伦”,“亚当]),(键:“B”,值:[“布莱恩”,“布列塔尼])]\n

您可以使用
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"]]
let sorted = dictionary.sorted {$0.key < $1.key}
print(sorted)

如果使用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 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"]]
let sorted = dictionary.sorted {$0.key < $1.key}
print(sorted)
let sorted=dictionary.sorted{$0.key<$1.key}
打印(已排序)
[(键:“A”,值:[“亚伦”,“亚当]),(键:“B”,值:[“布莱恩”,“布列塔尼])]\n


Swift 4的新字典初始值设定器可以为您完成所有功能:

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

Swift 4的新字典初始值设定器可以为您完成所有功能:

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

是的,但您不需要再访问characters属性。确实,旧习惯很难改变。这要求所有元素至少有一个Character注意,characters属性已被弃用,以防崩溃。您可以使用flatMap
let dict=[Character:[String]](contacts.flatMap{$0.first==nil?nil:($0.first!,[$0]),uniquingKeysWith:+)
是的,但您不需要再访问characters属性。事实上,旧习惯很难改变。这要求所有元素至少有一个Character注意,characters属性已被弃用,以防崩溃。您可以使用flatMap
let dict=[Character:[String]](contacts.flatMap{$0.first==nil?nil:($0.first!,[$0]),uniquingKeysWith:+)