Ho questa funzione:Aggiungere vincoli ai parametri generici in estensione
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
}
Come si può vedere, si trasforma un dizionario [Key: Value?]
in un [Key: Value]
uno (senza l'opzione).
Desidero estendere la classe con un nuovo metodo solo per le classi il cui valore è un Optional
di qualsiasi tipo, ma non riesco ad aggiungere vincoli ai parametri generici del dizionario.
Questo è quello che ho provato:
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
}
}
ma non riesce con l'errore:
Type 'Value' constrained to non-protocol type 'Optional<Any>'
è più facile implementa 'sugarCast()' come 'return self'. Personalmente raccomando di chiamare questo protocollo 'OptionalConvertible' e' sugarCast() '' toOptional() ', ma anche il tuo modo di procedere è corretto. –
Hai ragione, aggiornerò il mio codice – cezheng
Questo è un modo molto creativo per risolvere i limiti generici. Probabilmente lo userò in più posti. Grazie – redent84