元类型(.Type)可以用作字典中的键吗?

时间:2016-02-21 23:11:42

标签: xcode swift dictionary hashable

我有这样的事情:

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,那么我应该能够在字典中使用它。

所以现在我怀疑我打算做的事实际上是可行的,但是我根本无法使语法正确。

1 个答案:

答案 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)