我有这样的事情:
class Lumber { }
class Fruit { }
enum Size {
case Small
case Medium
case Large
}
let lumberSize = [
Size.Small: "2x4",
Size.Medium: "4x6",
Size.Large: "6x10"
]
let fruitSize = [
Size.Small: "grape",
Size.Medium: "apple",
Size.Large: "watermelon"
]
let size:[AnyObject.Type:Dictionary] = [
Lumber.Type: lumberSize,
Fruit.Type: fruitSize
]
在我的size
字典定义中,我从Xcode编辑器中得到了这个实时错误:
键入' AnyObject.Type'不符合协议' Hashable'
你可能认为这会解决问题。如果我想使用 X 作为字典中的键,并且它不可清除,则它根本无法使用。这是有道理的。
然而,有两件事让我怀疑错误信息。
首先,此时实时Xcode编辑器错误消息超出基本要求。每天好几次,我必须忽略它对错误的猜测,并在语法被接受之前摆弄它。
其次,我想在文档中读取反驳错误消息的单词。在Swift 2.2 Language Reference的 Types 下,它显示为:
类,结构或枚举类型的元类型是该类型的名称,后跟.Type
在Swift Standard Library Reference ObjectIdentifier结构参考中读取:
在Swift中,只有类实例和元类型具有唯一的标识。
该部分还列出了Hashable
作为符合的协议。
如果我正确阅读,那么所有类型都有Hashable使用的 ObjectIdentifier
。我(错误地?)使用Comparable作为例子。我们可以比较类型,因为它们的ObjectIdentifier符合Comparable?既然ObjectIdentifier也符合Hashable,那么我应该能够在字典中使用它。
所以现在我怀疑我打算做的事实际上是可行的,但是我根本无法使语法正确。
答案 0 :(得分:11)
img[0]=new Image();
img[0].src="imgimg/img"+i+".png";
img[0].onload=function(){
cntxt.drawImage(this,400,i*100,100,100);
i++;
img[i]=new Image();
img[i].src="invimg/img"+i+".png";
img[i].onload=this.onload;
};
是Hashable
实现的协议。这意味着ObjectIdentifier
可以播放,而不是ObjectIdentifier(Lumber.Type)
。您可以尝试更改代码以使用ObjectIdentifier,如:
Lumber.Type
这是编译,但我不确定它是否符合您的特定需求。就个人而言,我只会使用类名的字符串版本作为键 - class Lumber { }
class Fruit { }
enum Size {
case Small
case Medium
case Large
}
let lumberSize = [
Size.Small: "2x4",
Size.Medium: "4x6",
Size.Large: "6x10"
]
let fruitSize = [
Size.Small: "grape",
Size.Medium: "apple",
Size.Large: "watermelon"
]
let size:[ObjectIdentifier: [Size: String]] = [
ObjectIdentifier(Lumber): lumberSize,
ObjectIdentifier(Fruit): fruitSize
]
。即:
String(Lumber)