mam tej funkcji:Dodaj do ograniczenia parametrów generycznych w rozszerzeniu
func flatten<Key: Hashable, Value>(dict: Dictionary<Key, Optional<Value>>) -> Dictionary<Key, Value> {
var result = [Key: Value]()
for (key, value) in dict {
guard let value = value else { continue }
result[key] = value
}
return result
}
Jak widać, przekształca słownika [Key: Value?]
do [Key: Value]
jeden (bez opcjonalnego).
Chciałem rozszerzyć klasę Dictionary
o nową metodę tylko dla klas o wartości Optional
dowolnego typu, ale nie mogę dodać ograniczeń do ogólnych parametrów słownika.
To co próbowałem:
extension Dictionary where Value: Optional<Any> {
func flatten() -> [Key: Any] {
var result = [Key: Any]()
for (key, value) in self {
guard let value = value else { continue }
result[key] = value
}
return result
}
}
Ale nie powiedzie się z powodu błędu:
Type 'Value' constrained to non-protocol type 'Optional<Any>'
można łatwiej implementuj 'sugarCast()' jako 'return self'. Osobiście polecam wywoływanie tego protokołu 'OpcjonalnyConvertible' i' sugarCast() '' toOptional() ', ale twój sposób też jest w porządku. –
Masz rację, zaktualizuję mój kod – cezheng
To bardzo kreatywny sposób obejścia ogólnych ograniczeń. Prawdopodobnie użyję go w wielu miejscach. Dzięki – redent84