Не так легко, как вы могли бы подумать, на самом деле. Это немного грязно, потому что вам нужно справиться с тем, что, когда ключ отсутствует, вам нужно инициализировать массив. Вот один из способов сделать это (код изменен, чтобы быть похожими, но автономные):
var dictionary = [String: [String]]()
let courses = ["Thing","Other Thing","Third Thing"]
for course in courses {
// note, using `first` with `if…let` avoids a crash in case
// you ever have an empty course title
if let firstChar = first(course).map({String($0).uppercaseString}) {
// get out the current values
let current = dictionary[firstChar]
// if there were none, replace nil with an empty array,
// then append the new entry and reassign
dictionary[firstChar] = (current ?? []) + [course]
}
}
В качестве альтернативы, если вы хотите использовать .append
вы могли бы сделать это:
// even though .append returns no value i.e. Void, this will
// return Optional(Void), so can be checked for nil in case
// where there was no key present so no append took place
if dictionary[firstChar]?.append(course) == nil {
// in which case you can insert a single entry
dictionary[firstChar] = [course]
}
Есть две проблемы с этим , 1) поиск словарного ключа возвращает необязательный, поэтому вы не можете вызвать append на результат, вам нужно сначала развернуть опцию с помощью цепочки или карты или аналогичного, и 2) необходимо инициализировать массив, прежде чем вы сможете добавить к нему –