使用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”类型的值 '字符串'
答案 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?
本身就是Any
,Any
可以简单地提升为Any?
。所以Any
,Any?
,Any??
,Any???
等都是有点可互换的类型。这有点混乱,造成很多混乱。)
编译器会查找带有String
并返回Int
的下标,但找不到它。回滚到关于String
问题的诊断,这是一个非常非常迂回的方式,但这不是你所期待的。
您需要确保此处有Int
,并且它存在。举个例子:
if let x = userData["x"] as? Int {
dictionary[x] // "Test1"
}