struct Position {
var x: Int
var y: Int
}
extension Position: Equatable, Hashable {
}
let availablePositions = [Position(x: 0, y: 0), Position(x: 0, y: 1), Position(x: 1, y: 0)]
let gemPosition = Position(x: 1, y: 0)
for position in availablePositions {
if gemPosition == position {
print("Gem found at (\(position.x), \(position.y))!")
} else {
print("No gem at (\(position.x), \(position.y))")
}
}
if availablePositions.contains(gemPosition) {
print("availablePositions 包含 gemPosition")
} else {
print("availablePositions 不包含 gemPosition")
}
class Player {
var name: String
var position: Position
init(name: String, position: Position) {
self.name = name
self.position = position
}
}
// 注意点: == 和 hash(into:) 方法中必须使用相同的属性(名称和数量都要相同)
extension Player: Equatable {
static func ==(lhs: Player, rhs: Player) -> Bool {
return lhs.name == rhs.name && lhs.position == rhs.position
}
}
extension Player: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(position)
}
}
let p0 = Player(name: "0", position: Position(x: 0, y: 0))
let p1 = Player(name: "1", position: Position(x: 1, y: 1))
let p2 = Player(name: "0", position: Position(x: 0, y: 0))
let ps = [p0, p1, p2]
if p0 == p2 {
print("p0 = p2")
}
if p0 != p1 {
print("p0 != p1")
}
if ps.contains(p1) {
print("ps 包含 p1")
}
class MyNSObjectSubclass: NSObject {
var name: String
var position: Position
init(name: String, position: Position) {
self.name = name
self.position = position
}
}
// 注意点: isEqual 和 hash 方法中必须使用相同的属性(名称和数量都要相同)
extension MyNSObjectSubclass {
override func isEqual(_ object: Any?) -> Bool {
guard let other = object as? MyNSObjectSubclass
else { return false }
return self.name == other.name
&& self.position == other.position
}
override var hash: Int {
var hasher = Hasher()
hasher.combine(name)
hasher.combine(position)
return hasher.finalize()
}
}
let obj0 = MyNSObjectSubclass(name: "0", position: Position(x: 0, y: 0))
let obj1 = MyNSObjectSubclass(name: "1", position: Position(x: 1, y: 1))
let obj2 = MyNSObjectSubclass(name: "0", position: Position(x: 0, y: 0))
let objs = [obj0, obj1, obj2]
if obj0 == obj2 {
print("obj0 = obj2")
}
if obj0 != obj1 {
print("obj0 != obj1")
}
if objs.contains(obj1) {
print("objs 包含 obj1")
}
Equatable 和 Hashable 协议的用法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 2018.3.1 目标:身心健康,财富丰盛 好种子: 1早起健康早餐,种下健康的种子 2收拾家,回向女儿和众学子干...
- - (void)viewDidLoad {[superviewDidLoad];//创建UIScrollViewU...