【发布时间】:2017-05-27 10:09:54
【问题描述】:
我们有一个自定义 Swift 类的多个实例,它继承自 SKSpriteNode,并且能够正确执行以下代码(对于这个问题进行了大幅简化):
let instance1 = CustomClass()
let instance2 = CustomClass()
let instance3 = CustomClass()
let instance4 = CustomClass()
let array1 = [instance1, instance2]
let array2 = [instance3, instance4]
func check(testInstance: CustomClass) -> Bool {
return array1.filter({ $0 == testInstance }).count > 0
}
check(testInstance: instance3)
换句话说,执行check(testInstance: instance3) 按预期返回false。
但是,我们进行了大量更改,check 停止工作。
CustomClass 没有实现Equatable 协议。我们只想检测唯一的实例。
它是在我们使用ObjectIdentifier 时才开始工作的,这意味着函数变成了这样:
func check(testInstance: CustomClass) -> Bool {
return array1.filter({ ObjectIdentifier($0) == ObjectIdentifier(testInstance) }).count > 0
}
为什么需要ObjectIdentifier,什么时候应该使用它来实现对象相等?
这是用 Swift 3 编写的。
【问题讨论】:
-
基本上是
===,看这个:stackoverflow.com/questions/39587027/… -
@Hamish 身份比较,不找属性比较
-
@Crashalot 所以它继承自
NSObject?如果您命令单击==运算符,Xcode 将带您到被调用的重载。 -
@Crashalot 然后继承自
NSObject:) 所以isEqual(_:)的实现很可能是你需要寻找的地方。 -
@Hamish 是的,刚刚按照您的建议进行了命令单击,似乎使用了来自
NSObject的==函数。
标签: ios swift skspritenode sknode