Свифт 4
Как указано в fl034, это может быть упрощено с помощью Swift 4, где версия с проверкой ошибок выглядит так:
let foo = entries
.map { $0.components(separatedBy: "=") }
.reduce(into: [String:Int64]()) { dict, pair in
if pair.count == 2, let value = Int64(pair[1]) {
dict[pair[0]] = value
}
}
Еще проще, если вы не хотите, чтобы значения были целыми:
let foo = entries
.map { $0.components(separatedBy: "=") }
.reduce(into: [String:String]()) { dict, pair in
if pair.count == 2 {
dict[pair[0]] = pair[1]
}
}
Старый TL;DR
Минус проверка ошибок, это выглядит примерно так:
let foo = entries.map({ $0.componentsSeparatedByString("=") })
.reduce([String:Int]()) { acc, comps in
var ret = acc
ret[comps[0]] = Int(comps[1])
return ret
}
Используйте карту, чтобы превратить [String]
в разделенный [[String]]
, а затем создайте словарь [String:Int]
из этого, используя сокращение.
Или, добавив расширение к Dictionary
:
extension Dictionary {
init(elements:[(Key, Value)]) {
self.init()
for (key, value) in elements {
updateValue(value, forKey: key)
}
}
}
(Кстати, довольно полезное расширение, вы можете использовать его для множества операций с картами/фильтрами в словарях, очень жаль, что оно не существует по умолчанию)
Становится еще проще:
let dict = Dictionary(elements: entries
.map({ $0.componentsSeparatedByString("=") })
.map({ ($0[0], Int($0[1])!)})
)
Конечно, вы также можете комбинировать два вызова карты, но я предпочитаю разбивать отдельные преобразования.
Если вы хотите добавить проверку ошибок, можно использовать flatMap
вместо map
:
let dict2 = [String:Int](elements: entries
.map({ $0.componentsSeparatedByString("=") })
.flatMap({
if $0.count == 2, let value = Int($0[1]) {
return ($0[0], value)
} else {
return nil
}})
)
Опять же, если вы хотите, вы, очевидно, можете объединить map
в flatMap
или разделить их для простоты.
let dict2 = [String:Int](elements: entries.flatMap {
let parts = $0.componentsSeparatedByString("=")
if parts.count == 2, let value = Int(parts[1]) {
return (parts[0], value)
} else {
return nil
}}
)
person
David Berry
schedule
22.02.2016
=
и значение и назначить указанные данные словарю. - person Arc676   schedule 21.02.2016