gpt4 book ai didi

ios - 使类类型成为字典键(Equatable,Hashable)

转载 作者:搜寻专家 更新时间:2023-11-01 05:53:24 29 4
gpt4 key购买 nike

假设我有一个名为 LivingCreature 的类以及继承自它的其他类:

  • 人类

  • 外星人

这就是我想要完成的:

let valueForLivingCreature = Dictionary<Alien, String>

然后像这样访问它:

let alienValue = livingCreatureForValue[Alien]

但这意味着类应该符合 EquatableHashable,但类本身,而不是类实例。我尝试了多种方法来实现这一点,但没有成功。

我想出的折衷办法是:

typealias IndexingValue = Int
class LivingCreature {
static var indexingValue: IndexingValue = 0
}

然后我可以像这样使用类作为键:

 let livingCreatureForValue = Dictionary<IndexingValue, String>

访问:

let alienValue = livingCreatureForValue[Alien.indexingValue]

但是,这种方式应该手动为每个类设置 IndexingValue。我想像这样从类本身做一个散列:

class LivingCreature {
static var indexingValue: IndexingValue {
return NSStringFromClass(self).hash
}
}

这是不可能的,因为 self 是静态变量,不可访问。

我的问题是,是否有更好的方法来解决此类问题?

编辑:

@Paulw11 问我为什么不让 LivingCreature 确认为 Equatable 和 Hashable,原因是我无法通过类类型引用访问该值。 我每次都必须分配一个实例:

let alienValue = livingCreatureForValue[Alien()]

我不想每次都调用“Alien()”来查找值。使用它的组件不关心 livingCreature 实例,只关心类类型。

最佳答案

我假设你正在尝试类似的东西:

let valueForLivingCreature = Dictionary<LivingCreature.Type, String>

和:

let alienValue = valueForLivingCreature[Alien.self]

然后你可以使用ObjectIdentifier:

class LivingCreature {
class var classIdentifier: ObjectIdentifier {
return ObjectIdentifier(self)
}
//...
}

class Human: LivingCreature {
//...
}

class Dog: LivingCreature {
//...
}

class Alien: LivingCreature {
//...
}

let valueForLivingCreature: Dictionary<ObjectIdentifier, String> = [
Human.classIdentifier: String(Human),
Dog.classIdentifier: String(Dog),
Alien.classIdentifier: String(Alien),
]

let alienValue = valueForLivingCreature[Alien.classIdentifier] //->"Alien"

但在大多数情况下,当您想使用元类作为字典键时,您可以找到另一种方法:

class LivingCreature {
class var classValue: String {
return String(self)
}
//...
}

class Human: LivingCreature {
//...
//Override `classValue` if needed.
}

class Dog: LivingCreature {
//...
}

class Alien: LivingCreature {
//...
}

let alienValue = Alien.classValue //->"Alien"

关于ios - 使类类型成为字典键(Equatable,Hashable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39063537/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com