Sto cercando di implementare un'estensionee voglio gestire i valori opzionali. Ma qualunque cosa faccia, se uso il mio metodo su un dizionario [String: String?]
, non riesce a legare opzionalmente il valore. Come si scrive un'estensione a un dizionario che gestisce con garbo i valori opzionali?Come scrivere l'estensione del dizionario che gestisce i valori opzionali
Si consideri la seguente estensione:
extension Dictionary {
func someMethod() {
for (key, value) in self {
if let valueString = value as? String {
println(" \(key) = \(valueString)")
} else {
println(" \(key) = \(value) cannot be cast to `String`")
}
}
}
}
Quindi considerare il seguente codice:
let dictionary: [String: AnyObject?] = ["foo": "bar"]
dictionary.someMethod()
E riporta curiosamente
foo = Optional(bar) cannot be cast to `String`
posso scrivere una non estensione metodo che gestisce dict parametri ionici con valori opzionali, ma non vedi come farlo come estensione di Dictionary
.
riesco a spiegare il motivo per cui non funziona come ti sembra di aspettare. Se applicato a un oggetto facoltativo, 'as',' is', 'as?', E '==' (e gli altri comparatori) hanno un significato speciale: sono applicati a ciò che è avvolto. Il motivo per cui 'se let valueString = value as? String' non fa quello che sembra che sia in fase di compilazione, non sappiamo che 'value' _is_ è un Optional, e quindi non usiamo il significato speciale di' as' applicato a un Optional. Proviamo a lanciare il _itself_ opzionale in una stringa e, naturalmente, ciò non riesce; non puoi lanciare un _itself_ Opzionale su qualcosa. – matt
Come hai detto tu, credo, Swift sembra invitare l'uso di metodi di istanza, ma il potere effettivo è nelle funzioni globali di primo livello, perché ti permettono di costruire un vincolo generico che consente solo il tipo corretto attraverso la mesh, com'era. Il dizionario è un generico e non è possibile aggiungere ulteriori vincoli a un generico, quindi non sarà mai possibile farlo con un metodo di istanza in un'estensione. – matt