首页 文章

将项添加到Array作为字典值

提问于
浏览
0

我试图找出 Swift 中的最佳方法,将 Array 的值添加到 Dictionary 中的 Value . 我想 Build 一个按其名字的第一个字母排序的联系人字典 . 例如[A:[亚伦,亚当等],B:[布莱恩,布列塔尼,等...],......]

我发现了这个功能:

updateValue(_:forKey:)

并尝试在循环中使用它:

for contact in self.contacts.sorted() {
    self.contactDictionary.updateValue([contact], forKey: String(describing: contact.characters.first))           
}

但是当我尝试使用它时,它用新的数组替换了现有的数组 . 我知道我可以手动检查字典中的键是否存在,如果存在,检索数组然后追加新值,否则添加新的键/值对但我不确定Swift是否提供更容易/更好的方法来做到这一点 .

任何见解都将非常感谢!

2 回答

  • 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)
    

    “[(键:”A“,值:[”Aaron“,”Adam“]),(键:”B“,值:[”Brian“,”Brittany“])] \ n”

  • 0

    Swift 4的新词典初始化程序可以为您完成所有操作:

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

相关问题