在可哈希 class 中自动实现唯一 ID
Auto implement Unique ID in a hashable class
我创建了一个新的 class,我希望它是 Hashable 和 Equatable 以便我可以轻松地遍历它,下面是一个 class 示例:
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
}
问题是现在我必须在创建 class 时传递一个 uid,如下所示:
let user1 = MyUser(uid: 1, name: "Me", age: 36)
我想将 uid 设为静态并为我创建的每个对象自动生成一个新的,如下所示:
let user2 = User(name: "The other guy", age: 23)
在这种情况下,user2 的 uid 等于 2,它只是一个集合 属性 它不需要 get,因为它应该对使用 [=29= 的人完全透明].
但是每次我尝试将 uid 更改为 static var
或 class var
时,我都无法使其符合 Hashable protocol
提前致谢
我想你想要的是:(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
}
}
不确定那是你想要的,但万一你创建 "uid" 属性 的唯一原因是模拟一种引用相等而不是值相等(你可能是,因为你正在使用 类 而不是结构),你可能还想看看:
var hashValue: Int {
return ObjectIdentifier(self).hashValue
}
标为正确的解决方案很好,切中要害。我唯一担心的是 nextUid
是 var
,class 中的任何其他方法都可以更新。如果你想要更安全(甚至可重用)的解决方案,你可以这样做:
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
}
我创建了一个新的 class,我希望它是 Hashable 和 Equatable 以便我可以轻松地遍历它,下面是一个 class 示例:
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
}
问题是现在我必须在创建 class 时传递一个 uid,如下所示:
let user1 = MyUser(uid: 1, name: "Me", age: 36)
我想将 uid 设为静态并为我创建的每个对象自动生成一个新的,如下所示:
let user2 = User(name: "The other guy", age: 23)
在这种情况下,user2 的 uid 等于 2,它只是一个集合 属性 它不需要 get,因为它应该对使用 [=29= 的人完全透明].
但是每次我尝试将 uid 更改为 static var
或 class var
时,我都无法使其符合 Hashable protocol
提前致谢
我想你想要的是:(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
}
}
不确定那是你想要的,但万一你创建 "uid" 属性 的唯一原因是模拟一种引用相等而不是值相等(你可能是,因为你正在使用 类 而不是结构),你可能还想看看:
var hashValue: Int {
return ObjectIdentifier(self).hashValue
}
标为正确的解决方案很好,切中要害。我唯一担心的是 nextUid
是 var
,class 中的任何其他方法都可以更新。如果你想要更安全(甚至可重用)的解决方案,你可以这样做:
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
}