Swift 在可哈希类中自动实现唯一ID

Swift 在可哈希类中自动实现唯一ID,swift,hashtable,iequatable,Swift,Hashtable,Iequatable,我创建了一个新类,我希望它是可散列和可均衡的,这样我就可以轻松地循环使用它,下面是一个类示例: class MyClass: Hashable { var uid: Int var myName: String var myAge:Int var hashValue: Int { return self.uid } init(uid: Int, name: String, age: Int) { self.uid =

我创建了一个新类,我希望它是可散列和可均衡的,这样我就可以轻松地循环使用它,下面是一个类示例:

class MyClass: Hashable {
    var uid: Int
    var myName: String
    var myAge:Int
    var hashValue: Int {
        return self.uid
    }
    init(uid: Int, name: String, age: Int) {
        self.uid = uid
        self.myName = name
        self.myAge = age
    }
}

func ==(lhs: MyClass, rhs: MyClass) -> Bool {
    return lhs.uid == rhs.uid
}
问题是,现在我必须在创建类时传递uid,如下所示:

let user1 = MyUser(uid: 1, name: "Me", age: 36)
let user2 = User(name: "The other guy", age: 23)
我想使uid为静态,并为我创建的每个对象自动生成一个新的uid,如下所示:

let user1 = MyUser(uid: 1, name: "Me", age: 36)
let user2 = User(name: "The other guy", age: 23)
在这种情况下,user2的uid将等于2,它只是一个set属性,不需要get,因为它应该对使用该类的人完全透明

但是,每次我试图将uid更改为
静态变量
类变量
时,我都无法使其符合
哈希协议


提前感谢

我认为您想要的是:(1)您希望有一个type属性来存储下一个(或最后一个)要出售的UID;(2)每次创建用户时,您都希望自动为他们分配一个UID

下面类似的内容可以完成此任务(注意,我们还包括一个
generateUid()
函数):


不确定这是您想要的,但如果您创建“uid”属性的唯一原因是模拟某种引用相等而不是值相等(您可以这样做,因为您使用的是类而不是结构),您可能还需要查看:

var hashValue: Int { 
        return ObjectIdentifier(self).hashValue
    }

标记为“正确”的解决方案是好的,切中要害。我唯一关心的是
nextUid
是一个
var
,类中的任何其他方法都可以更新。如果您想要更安全(甚至可重复使用)的解决方案,可以执行以下操作:

class HashableIdGenerator {

    private var nextId = 0

    func generate() -> Int {
        nextId += 1
        return nextId
    }
}

class AClass: Hashable {

    private static let idGenerator = HashableIdGenerator()

    let uid: Int

    init() {
        uid = AClass.idGenerator.generate()
    }

    var hashValue: Int { return uid }

    // implement Equatable here
}

这就是我要找的!谢谢是–不需要所有ID文件都符合Hashable。可以使用:static func==(lhs:MyClass,rhs:MyClass)->Bool{return lhs==rhs}