Swift 4
Jak wspomniano przez fl034, to można uprościć niektóre z Swift 4, gdzie sprawdzane błąd wersja wygląda następująco:
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
}
}
jeszcze prostsze, jeśli nie chcą wartości jak Ints:
let foo = entries
.map { $0.components(separatedBy: "=") }
.reduce(into: [String:String]()) { dict, pair in
if pair.count == 2 {
dict[pair[0]] = pair[1]
}
}
Starsze TL; DR
Minus sprawdzanie błędów, to loo jaw dość dużo jak:
let foo = entries.map({ $0.componentsSeparatedByString("=") })
.reduce([String:Int]()) { acc, comps in
var ret = acc
ret[comps[0]] = Int(comps[1])
return ret
}
Korzystanie mapie, aby włączyć [String]
w ułamku się [[String]]
a następnie zbudować słownika [String:Int]
że korzystając ze zmniejszenia.
Albo, dodając rozszerzenie Dictionary
:
extension Dictionary {
init(elements:[(Key, Value)]) {
self.init()
for (key, value) in elements {
updateValue(value, forKey: key)
}
}
}
(Bardzo przydatne rozszerzenie btw, można go używać do wielu operacji map/filtracyjnych na słowniki, naprawdę rodzaj wstydu nie robi” t istnieje domyślnie)
staje się jeszcze prostsze:
let dict = Dictionary(elements: entries
.map({ $0.componentsSeparatedByString("=") })
.map({ ($0[0], Int($0[1])!)})
)
oczywiście, można również połączyć dwa połączenia map, ale wolę, aby rozbić individu al przekształca.
Jeśli chcesz dodać sprawdzanie błędów, flatMap
może być stosowany zamiast 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
}})
)
Ponownie, jeśli chcesz, możesz oczywiście połączyć map
do flatMap
lub podzielić je na prostotę.
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
}}
)
Jeśli ciągi w tablicy są zawsze w tym samym formacie, można przeanalizować wartość klucza, '=' i wartość oraz przypisać te dane do słownika. – Arc676
@ Arc676 to imperatywne podejście, na pewno, faktycznie już to mam ... ale szukam deklaratywnego rozwiązania. –