extension Dictionary where Key: ExpressibleByStringLiteral, Value: Any {
func date(forKey key: String) -> Date? {
return self[key] as? Date
}
}
let dictionary: [String : Any] = ["mydate" : Date(), "otherkey" : "Rofl"]
dictionary.date(forKey:"mydate") // should return a Date? object
// j'obtiens la référence ambiguë d'erreur au membre "indice"
Comment puis-je faire en sorte que mon extension me permette de donner une clé et d'utiliser l'indice non pas avec un littéral, mais avec une clé "dynamique" sous forme de chaîne?
Réponses:
4 pour la réponse № 1Supprimez les contraintes inutiles et utilisez directement Key
ou Value
tapez où bon vous semble.
extension Dictionary {
func date(forKey key: Key) -> Date? {
return self[key] as? Date
}
}
2 pour la réponse № 2
Juste remplacer key: String
avec key: Key
:
extension Dictionary where Key: ExpressibleByStringLiteral, Value: Any {
func date(forKey key: Key) -> Date? {
return self[key] as? Date
}
}
1 pour la réponse № 3
Vous pouvez obtenir un peu de syntaxe sucrée en "proxy" la requête de date à quelque chose comme ceci:
struct DictionaryValueProxy<DictKey: Hashable, DictValue, Value> {
private let dictionary: [DictKey:DictValue]
init(_ dictionary: [DictKey:DictValue]) {
self.dictionary = dictionary
}
subscript(key: DictKey) -> Value? {
return dictionary[key] as? Value
}
}
extension Dictionary {
var dates: DictionaryValueProxy<Key, Value, Date> { return DictionaryValueProxy(self) }
}
Vous pouvez ensuite demander au dictionnaire ses dates de manière transparente:
let dict: [Int:Any] = [1: 2, 3: Date()]
dict.dates[1] // nil
dict.dates[3] // "Dec 7, 2016, 5:23 PM"