说我有一个名为LivingCreature的类
以及从中继承的其他类:

  • Human
  • Dog
  • Alien

  • 这是我要完成的工作:
    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是静态var,无法访问。

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

    编辑:

    @ 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/

    10-15 04:38