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

10

我有这样的东西:

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'

我该如何使用 size 完成我想做的事情?也就是说,如何创建一个将类型链接到其特定大小字典的字典?

我认为 ObjectIdentifier 会对我有所帮助,因为它是可哈希的,但我不知道如何使用它,或者它是否是正确的选择。

1个回答

13

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?")

这段代码可以编译并打印出"2x4",但我不确定它是否符合您的特定需求。个人建议只使用类名的字符串版本作为键值 - 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?")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接