我正在尝试找出Swift
中Array
向Value
中Dictionary
添加updateValue(_:forKey:)
值的最佳方法。我想建立一个按其名字的第一个字母排序的联系人字典。例如[A:[亚伦,亚当等],B:[布莱恩,布列塔尼,等......],......]
我发现了这个功能:
for contact in self.contacts.sorted() {
self.contactDictionary.updateValue([contact], forKey: String(describing: contact.characters.first))
}
尝试在循环中使用它:
dpkg-reconfigure locales
但是当我尝试使用它时,它用新的数组替换了现有的数组。我知道我可以手动检查字典中的键是否存在,如果存在,检索数组然后追加新值,否则添加新的键/值对但我不确定Swift是否提供更容易/更好的方法来做到这一点。
非常感谢任何见解!
答案 0 :(得分: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"]]
请注意,结果未排序。字典是无序集合。如果你需要对字典进行排序并返回一组(key,Value)元组,你可以使用按键排序,如下所示:
let sorted = dictionary.sorted {$0.key < $1.key}
print(sorted)
&#34; [(关键:&#34; A&#34;,价值:[&#34; Aaron&#34;,&#34; Adam&#34;]),(关键:&#34; B&#34;,价值:[&#34; Brian&#34;,&#34;布列塔尼&#34;])] \ n&#34;
答案 1 :(得分:0)
Swift 4的新词典初始化程序可以为您完成所有操作:
let contactInitials = contacts.filter{!$0.isEmpty}.map{ ($0.first!,[$0]) }
let dict = [Character:[String]](contactInitials, uniquingKeysWith:+)