/ / Comment créer une extension pour dictionnaire permettant l'utilisation de l'indice avec une clé dynamique? - swift, swift-extensions

Comment faire une extension pour dictionnaire qui permet d'utiliser l'indice avec une clé dynamique? - rapide, rapide-extensions

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 № 1

Supprimez 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"