2017-12-22 1 views
1

Ich bin auf der Suche nach einer eleganten (funktionalen) Methode zum Filtern eines Wörterbuchs basierend auf dem Paarwerttyp, wenn alle Werte nicht vom selben Typ sind. I.e. ein Weg von [AnyHashable : Any] zu [AnyHashable : T] zu gehen?Wie würden Sie ein schnelles Wörterbuch auf seinen Werttyp filtern?

Mit flatMap gibt Ihnen eine Reihe von Tupeln, die reduziert werden könnten:

var result = dictionary.flatMap({ pair in 
    pair as? (AnyHashable, T) 
}).reduce([AnyHashable : T]()) { dict, tuple in 
    var dict = dict 
    dict[tuple.0] = tuple.1 
    return dict 
} 

Aber ich bin nicht zufrieden mit dieser Implementierung ... sind Sie?

Antwort

1

Ich bin kein Fan von reduce hierfür scheint Dictionary(uniqueKeysWithValues:) besser geeignet:

let dict: [AnyHashable: Any] = [ 
    1: 1, 
    2: "foo", 
    "3": 3, 
    4: 5.0, 
    true: "17" 
] 

func filterByType<T>(_ dict: [AnyHashable: Any]) -> [AnyHashable: T] { 
    return Dictionary(uniqueKeysWithValues: dict.flatMap { ($0,$1) as? (AnyHashable, T) }) 
} 

let strValues: [AnyHashable: String] = filterByType(dict) 
1

Sie Swift 4 reduce(into:) Methode verwenden kann, die das Teilergebnis bereits wandelbar ist:

extension Dictionary { 
    func flatMapValues<T>(into type: T.Type) -> [Key: T] { 
     return reduce(into: [:]) { $0[$1.key] = $1.value as? T } 
    } 
} 

let dict: [AnyHashable: Any] = ["key1": 1, "key2": 2, 3: "Three", Date(): "Just a String", "key5": 5] 

let integersDictionary = dict.flatMapValues(into: Int.self) // ["key2": 2, "key5": 5, "key1": 1] 
Verwandte Themen