¿Qué debe hacer para que las operaciones establecidas funcionen en objects personalizados?

Hice un pequeño patio para hacer algunas testings en las operaciones Establecer con objects personalizados, pero todavía están fallando y no tengo idea de por qué.

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 } 

Luego, hice dos sets de objects de 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] 

Pero cuando hago una operación así:

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

newSet es idéntico a userSet1 y ninguno de los sets se modifica.

¿Qué debo hacer para que estas operaciones establecidas funcionen?

 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 

No puedes devise tu propia idea de qué usar como valor hash. El requisito de hashability es: el valor hash de dos objects debe ser el mismo si esos dos objects son iguales .

Ha proporcionado un algorithm de valor hash, pero no ha hecho nada para que la ecualización de sus objects de usuario coincida con él.

Aquí hay un object Usuario que se puede cambiar en un set:

 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 } } 

Observe que he eliminado la complicación de hacer que esta cosa también sea un NSObject. Las cosas son un poco diferentes si quieres hacer eso; necesitará pensar sobre cómo funciona NSObject.