2017-03-28 17 views
0

SKSpriteKitのuserDataプロパティを使用して、次の行をグリッドのx座標とy座標をノードに添付しました。変数をキーとして使用してスウィフト辞書にアクセスする

node.userData = ["x": x, "y": y] 

私はtouchesBeganを使用して、この機能にデータを送信しています。

func touched(userData: NSDictionary) { 
     print(userData) 
    } 

コンソールは、必要なデータを正常に印刷します。この辞書を使用して...私は、その後使用して、関連するキーペアを取得したい

var dictionary: [AnyHashable : Any] = [1: "Test1", 
          2: "Test2", 
          3: "Test3", 
          4: "Test4", 
          5: "Test5", 
          6: "Test6", 
          7: "Test7" 
] 

dictionary[userData["x"]] 

は、しかし、私は次のエラーを取得する:

Cannot subscript a value of type 'NSDictionary' with an index of type 'String'

+2

なぜSwiftで「NSDictionary」を使用していますか?適切なタイプのSwift辞書を使用してください。なぜあなたは '[Int:String]'を使うべきなのですか? 'AnyHashable'と' Any'で 'dictionary'変数を宣言するのはなぜですか? – rmaddy

+0

ここでrmaddyがどこに向かうのかを再考するために、 'Any *'型と 'NSDictionary'(' Any * '型に橋渡しする)の使用は、ほとんど常にこのようなキャストの問題と型の不一致を引き起こすでしょう。特別なケース(特にObjCへのブリッジ)に対処するために、「Any」とその親が存在します。それらは汎用ツールではありません。型を意図したもの(この場合は '[Int:String]')のみを使用すれば、コンパイラがあなたのために処理します。 –

+0

私はそれを変換しようとしましたが、SpriteKitのuserDataはSwift辞書の代わりにNSDictionaryとして与えられています。私は辞書の変数を[Int:String]に変更しましたが、まだ同じエラーが発生しています – user7732807

答えて

0

です古典的なケースでは、Anyキャスティングによる誤解を招く可能性があります。

ただ、問題を単純化(およびSpriteKitベースを取り除く)ために:

Cannot subscript a value of type 'NSDictionary' with an index of type 'String' 

しかし、それは本当に問題ではない:

let userData: NSDictionary = ["x": 1, "y": 2] 
let dictionary = [1: "Test1", 
        2: "Test2", 
        3: "Test3", 
        4: "Test4", 
        5: "Test5", 
        6: "Test6", 
        7: "Test7" 
] 
dictionary[userData["x"]] 

診断です。主な問題は、userData["x"]がOptional(Any?)を返すことです。 Optionalは、これが常に動作しないようにします。しかし、Any?は、Swiftのすべての種類の問題を作成するbizarroタイプです。 (Any?Anyそのものであり、そしてAnyは自明Any?に促進することができるので。だから、AnyAny?Any??Any???などはすべて多少交換可能なタイプです。それは混乱のビットだと多くの混乱を作成します。)

コンパイラは、Stringを取り、Intを返し、見つからない添え字を探しています。問題は、非常に非常にラウンドアバウトの方法であるStringについての診断にロールバックされますが、あなたが期待していたものではありません。

ここにはIntが存在することと、それが存在することを確認する必要があります。一例:

if let x = userData["x"] as? Int { 
    dictionary[x] // "Test1" 
} 
+0

助けがあれば、 'dictionary'のデータ構造を[Int:Int?]に変更しましたか?辞書内のキーペアの値が 'if dictionary [x]!= nil'を使用してnilでないかどうかをチェックし、SK userDataの値がキーペアの値と' ifノート[x] == y'。私は_インテル[Int:Int?] '(別名inoutディクショナリ>)_ – user7732807

+0

の型の値を添字にしていません。この場合のnotes [x] 'は' Int ?? ' (doubleオプション)、もし 'notes'が' [Int:Int?] 'であると分かっているならば。辞書にオプションの値を持つことは非常に奇妙です。なぜ価値がないのはなぜですか?覚えておくべき重要な点は、辞書の添字は常にオプションであることです。したがって、あなたの 'dictionary [x]!= nil'の場合、これは非常にあいまいです。オプションの宣伝は、とにかくその等価チェックを動作させるかもしれませんが、それは非常にトリッキーな構造です。 –

+0

私は正しいと思います(私は正しいと思います。 'm'が間違っている)、オプ​​ションの値が必要な場合もあります。 'notes'を[Int:Int]に変更すると、エラーメッセージがスローされます。次に、ノートのいずれかが 'nil'であるかどうか確認するために辞書をチェックしなければなりません。 – user7732807

関連する問題