私はDictionary
拡張を実装しようとしており、オプションの値を扱いたいと思います。しかし、私が何をするにしても、[String: String?]
辞書で自分のメソッドを使用すると、オプションで値をバインドすることができません。オプションの値を適切に扱う拡張機能をどのようにして辞書に書いていますか?書く方法任意の値を扱う辞書拡張子
次の拡張を検討:
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`")
}
}
}
}
だから、次のコードを考えてみます。
let dictionary: [String: AnyObject?] = ["foo": "bar"]
dictionary.someMethod()
をそして、それが妙に私が非拡張を書くことができます
foo = Optional(bar) cannot be cast to `String`
報告をdictを処理するメソッド任意の値を持つ非イオン性パラメータを返しますが、それをどのようにしてDictionary
の拡張子として扱うかわかりません。
あなたが期待するように見えるとして、それが動作しない理由を私は説明することができます。 Optional、 'as'、' is'、 'as?'、 '=='(そして他のコンパレータ)には特別な意味があります:これは物事に適用されます。理由は 'なぜlet valueString = value as?文字列 'はコンパイル時に' value'が分からないことを期待しているようです。_is_ anオプションで、オプションに適用される 'as'の特別な意味を使用しません。 Optional _itself_をStringにキャストしようとしますが、もちろん失敗します。任意の_itself_を何かにキャストすることはできません。 – matt
あなた自身が言っているように、Swiftはインスタントメソッドの使用を招待しているようですが、実際のパワーはトップレベルのグローバル関数にあります。メッシュを通して正しいタイプのみを可能にするジェネリックコンストレインを構築でき、それはそうだった。ディクショナリは一般的なものであり、ジェネリックに制約を追加することはできないため、エクステンション内のインスタンスメソッドでこれを行うことはできません。 – matt