您必须做什么才能使设置操作适用于自定义对象?

时间:2015-10-10 17:34:37

标签: ios swift set

我做了一个小操场,用自定义对象对Set操作进行了一些测试,但它们仍然失败,我不知道为什么。

class User: NSObject {
    let id: String
    init(id: String) {
        self.id = id
        super.init()
    }

    override var hashValue: Int {
        get {
            return id.hashValue
        }
    }

    override var description: String {
        get {
            return id
        }
    }
}


func ==(lhs: User, rhs: User) -> Bool {
    return lhs.hashValue == rhs.hashValue
}

然后,我制作了两组User个对象:

let user1 = User(id: "zach")
let user2 = User(id: "john")
let user3 = User(id: "shane")


let user4 = User(id: "john")
let user5 = User(id: "shane")
let user6 = User(id: "anthony")

let userSet1 : Set<User> = [user1, user2, user3]
let userSet2 : Set<User> = [user4, user5, user6]

但是当我做这样的操作时:

let newSet = userSet1.subtract(userSet2)
print(newSet)

newSetuserSet1相同,并且没有任何集合被修改。

我该怎样做才能让这些设置操作起作用?

id:zach -> 4799450060450308971
id:john -> 4799450060152454338
id:shane -> -4799450060637667915
id:john -> 4799450060152454338
id:shane -> -4799450060637667915
id:anthony -> 4799450059843449897
id:shane -> -4799450060637667915
id:anthony -> 4799450059843449897
id:john -> 4799450060152454338

1 个答案:

答案 0 :(得分:3)

您无法自己决定使用什么作为哈希值。可持续性的要求是:如果这两个对象相等,则两个对象的哈希值必须是相同

您提供了一个哈希值算法,但您没有做任何关于使您的User对象的可公性与之匹配。

这是一个可以在集合中加载的User对象:

func ==(lhs:User, rhs:User) -> Bool {
    return lhs.id == rhs.id
}
class User: Hashable, CustomStringConvertible {
    let id: String
    init(id: String) {
        self.id = id
    }
    var hashValue: Int {
        return id.hashValue
    }
}

观察我已经删除了使这个东西也成为NSObject的复杂性。如果你想这样做,事情会有所不同;你需要考虑NSObject的工作原理。