Скажем, у меня есть карта ключей для массивов значений и хотите добавить значение в одной из этих массивов:Как добавить значения в массив, хранящийся на карте?
func addVal<K:Hashable, V>(map: inout [K: [V]], new: (key: K, val: V)) {
if var list = map[new.key] {
list.append(new.val)
} else {
map[new.key] = [new.val]
}
}
Этот код не будет работать: поскольку массивы имеют семантику значений, list
является копией map[new.key]
, и новое значение никогда не будет вставлено в сохраненный массив.
Есть ли хороший, идиоматический путь к этому?
Я знаю, что это работает отлично:
func addVal<K:Hashable, V>(map: inout [K: [V]], new: (key: K, val: V)) {
if map[new.key] != nil {
map[new.key].append(new.val)
} else {
map[new.key] = [new.val]
}
}
Я считаю, что это не-приятный обходной путь, хотя; Я бы предпочел иметь дело с опциями, не проверяя явно для nil
.
Использование контекста: [группировать массивы] (http://stackoverflow.com/questions/41564580/ групповые элементы-оф-ан-массива-на-какой-недвижимости/41566988 # 41566988). – Raphael
Если вы не хотите, чтобы массив был скопирован, см. Http://stackoverflow.com/questions/41079687/dictionary-in-swift-with-mutable-array-as-value-is-performing-very-slow -как. Основываясь на вашем примере использования, см. Также http://stackoverflow.com/questions/31220002/how-to-group-by-the-elements-of-an-array-in-swift – Hamish