Ich habe diese Funktion:in Verlängerung
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
}
Wie Sie sehen können, es wandelt ein [Key: Value?]
Wörterbuch in ein [Key: Value]
ein (ohne die optional).
Ich wollte die Dictionary
Klasse mit einer neuen Methode nur für Klassen, deren Wert ist ein Optional
von einem beliebigen Typ, aber ich bin nicht in der Lage, Einschränkungen zu den generischen Parameter des Wörterbuchs hinzuzufügen. Diese
ist, was ich versucht:
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
}
}
Aber irgendwie Fehler:
Type 'Value' constrained to non-protocol type 'Optional<Any>'
Sie können leichter Implementiere 'sugarCast()' als 'return self'. Ich empfehle persönlich, dieses Protokoll 'OptionalConvertible' und' sugarCast() '' toOptional() 'zu nennen, aber Ihr Weg ist auch in Ordnung. –
Sie haben Recht, ich werde meinen Code aktualisieren – cezheng
Das ist ein sehr kreativer Weg zur Umgehung generischer Einschränkungen. Ich werde es wahrscheinlich an mehr Orten verwenden. Danke – redent84