2017-03-15 7 views
0

はスウィフト3へのforループを変換した後、私はエラー得なかった「タイプ 『をどれが』は添字のメンバーを持っていない」の変換エラー:タイプ「どれが」は添字メンバー

for inputKey in inputKeys where attributes[inputKey]?[kCIAttributeClass] == "NSNumber" 
           .....................^ 
{ 

} 

私のようなものを追加して期待

for inputKey in inputKeys where attributes[inputKey]as?[String:Any][kCIAttributeClass] == "NSNumber" 

が、これはまだスウィフトの構文を使用して、いくつかの問題を抱えている :-(動作しません。

+0

ここで、/ attributesはどのように定義されていますか?基本的に、コンパイラはすべての添え字付きオブジェクトの型を知っていなければなりません。 – vadian

+0

実際には、 'for'ループでは 'where'がまだサポートされています。 – jlehr

+0

[Type 'Any'の複製がxcode 8 Swift 3の下付きメンバを持たない](http://stackoverflow.com/questions/39516199/type-any-has-no-subscript-members-in-xcode-8- swift-3) – JAL

答えて

1

あなたはattributesが実際に01になりたいように見えます- 辞書の辞書。

いずれか、またはattributes[inputKey][String:String]にキャストできます。私はこれが仕事だと思う

for inputKey in inputKeys where (attributes[inputKey] as? [String:String])?[kCIAttributeClass] == "NSNumber" 

コメントあたりの編集:

attributesので、実際には、あなたは、[String: [String: String]]であることが保証、だけ[String: [String: Any]](とそうでないかもしれないそれさえも)されていません安全のためには、追加のas?キャストが必要です。 1行に、多くのキャストで

、私は代わりにこのような巨大なwhere句を持つのfor体の冒頭にguardステートメントにテストを配置する方が良いだろうと思います。

+0

ありがとう、それはまさに必要なものでした:-) – 3ef9g

+0

これはコンパイルされますが、期待される結果が得られないことがあります。 [documentation](https://developer.apple.com/reference/coreimage/cifilter/1437661-attributes)によると、 'attributes'の辞書はおそらく' [String:Any] '型です。 – Caleb

+1

その場合、属性[inputKey]を '[String:Any]'にキャストし、 '[kCIAttributeClass]'添え字の結果を 'as?文字列 'このような複雑な 'where'節ではなく、ループ本体の先頭に' guard'文を使用すると、より綺麗になるかもしれません。 – Uncommon

関連する問題