Начиная с Swift 4, следующее решение более короткое:
func occurencesOfCharacters(in text: String) -> [Character: Int] {
return Dictionary(text.map{ ($0, 1) }, uniquingKeysWith: { $0 + $1 })
}
print(occurencesOfCharacters(in: "memerr"))
Как это работает
В Swift 4,
.characters
не нужно, так как строки - это последовательности символов.
Код
text.map{ ($0, 1) }
даёт последовательность вида
("m", 1), ("e", 1), ...
Конструктор
Dictionary
превращает эту последовательность в словарь вида
["m": 1, "e": 1, ...]
.
Когда этот конструктор встречает две пары с одинаковыми ключами, он мержит их значения по указанному правилу, по сути, подсчитывая количество вхождений данного символа.
Замечу, что решение от
DevMan, выписанное "вручную", должно работать более быстро, так как там нет промежуточного представления в виде последовательности кортежей. Но только если убрать двойное обращение к Dictionary на каждой итерации.
Edit: Этот код должен чуть быстрее работать. Мог бы быть ещё быстрее, но увы, в Dictionary нет для этого некоторых нужных методов.
func occurencesOfCharacters(in text: String) -> [Character: Int] {
var dicOfChars: [Character: Int] = [:]
for character in text.characters {
dicOfChars[character] = (dicOfChars[character] ?? 0) + 1
}
return dicOfChars
}
print(occurencesOfCharacters(in: "memerr"))