2015-06-20 26 views
2

我创造,我想成为哈希的和Equatable一个新的类,所以我可以很容易地通过它循环,类下面的例子是:自动执行的唯一ID的哈希的类

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属性,它不需要获取get,因为它应该对使用该类的人完全透明。

但是每次我试图改变UID是一个static varclass var我不能让它提前与Hashable protocol

由于符合

回答

3

我想你会的是:(1)你'想拥有一个存储下一个(或最后一个)UID的type属性,并且(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 
    } 
} 
+0

这也正是我一直在寻找!谢谢! – Icaro

9

不知道这是你想要的,但如果你创建了一个“UID”属性的唯一原因是模仿一种参考平等,而不是值相等(你可能是,因为你使用类而不是结构),你可能还需要查看:

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

是的 - 不需要所有的ID混合符合Hashable。也许服务于: static func ==(lhs:MyClass,rhs:MyClass) - > Bool {return lhs === rhs} – Giles

0

解决方案标记为正确的是好的,正确的点。我唯一担心的是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 
}