3

我创建了一个新类,我希望它是 Hashable 和 Equatable,这样我就可以轻松地遍历它,下面是一个类示例:

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)

我想让 uid 静态并为我创建的每个对象自动生成一个新的,如下所示:

let user2 = User(name: "The other guy", age: 23)

在这种情况下,user2 的 uid 将等于 2,它只是一个不需要获取的 set 属性,因为它应该对使用该类的人完全透明。

但是,每次我尝试将 uid 更改为 astatic var或 aclass var时,我都无法使其符合Hashable protocol

提前致谢

4

3 回答 3

10

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

var hashValue: Int { 
        return ObjectIdentifier(self).hashValue
    }
于 2015-10-06T15:30:13.360 回答
4

我认为你想要的是:(1)你想要一个类型属性来存储下一个(或最后一个)要出售的 UID,以及(2)每次创建用户时,你都会喜欢它们自动分配一个 UID。

像下面这样的东西可以完成这个任务(注意我们还包括一个generateUid()函数):

class MyClass: Hashable {
    static var nextUid = 1
    static func generateUid() -> Int {
      return nextUid++
    }

    let uid: Int
    var myName: String
    var myAge:Int
    var hashValue: Int {
        return self.uid
    }
    init(name: String, age: Int) {
        self.uid = MyClass.generateUid()
        self.myName = name
        self.myAge = age
    }
}
于 2015-06-20T06:50:57.197 回答
1

标记为正确的解决方案很好而且切中要害。我唯一担心的是,类中nextUidvar任何其他方法都可以更新。如果您想要更安全(甚至可重用)的解决方案,您可以执行以下操作:

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
}
于 2017-03-31T12:18:59.340 回答