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

Jef*_*eff 9 xcode dictionary hashable swift

我有这样的事情:

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
]
Run Code Online (Sandbox Code Playgroud)

在我的size字典定义中,我从Xcode编辑器中得到了这个实时错误:

类型'AnyObject.Type'不符合协议'Hashable'

你可能认为这会解决问题.如果我想在字典中使用X作为键,并且它不可以使用,则它根本无法使用.那讲得通.

但是,有两件事让我怀疑错误信息.

首先,此时实时Xcode编辑器错误消息超出基本要求.每天好几次,我必须忽略它对错误的猜测,并在语法被接受之前使用它.

其次,我想在文档中读取反驳错误消息的单词.在Swift 2.2语言参考中,在类型下,它显示为:

类,结构或枚举类型的元类型是该类型的名称,后跟.Type

并在Swift标准库参考 ObjectIdentifier结构参考中读取:

在Swift中,只有类实例和元类型具有唯一的标识.

该部分还列出size了它符合的协议.

如果我正确阅读,那么所有类型都有 ObjectIdentifier Hashable使用的类型.我(错误地?)使用Comparable作为例子.我们可以比较类型,因为它们的ObjectIdentifier符合Comparable?既然ObjectIdentifier也符合Hashable,那么我应该能够在字典中使用它.

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

Mic*_*ael 11

Hashable是一个ObjectIdentifier实现的协议.这意味着ObjectIdentifier(Lumber.Type)可以清洗,而不是Lumber.Type.您可以尝试更改代码以使用ObjectIdentifier,如下所示:

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.self): lumberSize,
    ObjectIdentifier(Fruit.self): fruitSize
]

let t = size[ObjectIdentifier(Lumber.self)]
let s = t?[.small]
print(s ?? "no s?")
Run Code Online (Sandbox Code Playgroud)

编译,但我不确定它是否符合您的特定需求.就个人而言,我只会使用类名的字符串版本作为键 - String(Lumber).即:

let size:[String:[Size:String]] = [
    String(describing:Lumber.self): lumberSize,
    String(describing:Fruit.self): fruitSize
]

let t = size[String(describing:Lumber.self)]
let s = t?[.small]
print(s ?? "no s?")
Run Code Online (Sandbox Code Playgroud)