【问题标题】:Auto implement Unique ID in a hashable class在可散列类中自动实现唯一 ID
【发布时间】:2015-09-06 04:21:03
【问题描述】:

我创建了一个新类,我希望它是 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 更改为 static varclass var 时,我都无法使其符合 Hashable protocol

提前致谢

【问题讨论】:

    标签: swift hashtable iequatable


    【解决方案1】:

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

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

    【讨论】:

    • 是的——不需要所有的 ID kerfuffle 都符合 Hashable。也许服务于: static func == (lhs: MyClass, rhs: MyClass) -> Bool { return lhs === rhs }
    【解决方案2】:

    我认为你想要的是:(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
        }
    }
    

    【讨论】:

    • 这就是我想要的!谢谢!
    【解决方案3】:

    标记为正确的解决方案很好而且切中要害。我唯一担心的是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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多