使用变量作为键访问Swift词典

时间:2017-03-28 15:41:01

标签: swift dictionary skspritenode

使用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"]]

但是,我收到以下错误:

  

不能使用索引类型下标“NSDictionary”类型的值   '字符串'

1 个答案:

答案 0 :(得分:0)

这是由于Any投射导致误导性诊断的经典案例。

只是为了简化问题(并摆脱SpriteKit):

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

诊断是:

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

但这不是问题所在。主要问题是userData["x"]返回Optional(Any?)。 Optional会始终使其无法正常工作。但是Any?也是一种奇怪的类型,它为Swift带来了各种各样的问题。 (因为Any?本身就是AnyAny可以简单地提升为Any?。所以AnyAny?Any??Any???等都是有点可互换的类型。这有点混乱,造成很多混乱。)

编译器会查找带有String并返回Int的下标,但找不到它。回滚到关于String问题的诊断,这是一个非常非常迂回的方式,但这不是你所期待的。

您需要确保此处有Int,并且它存在。举个例子:

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