I\'ve started to learn swift after Java. In Java I can use any object as a key for HashSet, cause it has default hashCode
and equals
based on objec
Swift 5 barebones
For a barebones implementation of making a class hashable, we simply must conform to both the Equatable
and Hashable
protocols. And if we know our object well, we can determine which property or properties to use to make it equatable and hashable.
class CustomClass: Equatable, Hashable {
let userId: String
let name: String
let count: Int
init(userId: String, name: String, count: Int) {
self.userId = userId
self.name = name
self.count = count
}
/* Equatable protocol simply means establishing a predicate to
determine if two instances of the same type are equal or unequal based
on what we consider equal and unequal. In this class, userId makes
the most sense so if we were to compare two instances (left-hand-side
versus right-hand-side), we would compare their userId values. When
it comes time to compare these objects with each other, the machine
will look for this function and use it to make that determination. */
static func == (lhs: CustomClass, rhs: CustomClass) -> Bool {
return lhs.userId == rhs.userId
}
/* Hashable protocol is similar to Equatable in that it requires us to
establish a predicate to determine if two instances of the same
type are equal or unequal, again based on what we consider equal and
unequal. But in this protocol we must feed that property into a
function which will produce the object's hash value. And again, userId
makes the most sense because each instance carries a unique value. If
userId was not unique, we could combine multiple properties to
generate a unique hash. */
func hash(into hasher: inout Hasher) {
hasher.combine(userId)
//hasher.combine(name) if userId was not unique, we could have added this
}
}