Ios 快速平等需要客观识别器?
我们有一个自定义Swift类的多个实例,该类继承自SKSpriteNode,并且能够正确地执行以下代码(对于这个问题进行了大幅简化):Ios 快速平等需要客观识别器?,ios,swift,skspritenode,sknode,Ios,Swift,Skspritenode,Sknode,我们有一个自定义Swift类的多个实例,该类继承自SKSpriteNode,并且能够正确地执行以下代码(对于这个问题进行了大幅简化): let instance1 = CustomClass() let instance2 = CustomClass() let instance3 = CustomClass() let instance4 = CustomClass() let array1 = [instance1, instance2] let array2 = [instance3,
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
未实现equalable
协议。我们只想检测唯一的实例
当我们使用ObjectIdentifier
时,它才开始工作,这意味着功能更改为:
func check(testInstance: CustomClass) -> Bool {
return array1.filter({ ObjectIdentifier($0) == ObjectIdentifier(testInstance) }).count > 0
}
为什么需要ObjectIdentifier
,什么时候应该用于对象相等
这是用Swift 3写的
为什么需要ObjectIdentifier
,什么时候应该用于对象相等
您不需要使用ObjectIdentifier
来执行标识比较。在这种情况下,您可以简单地使用标识运算符,因为对于类实例,该运算符相当于使用ObjectIdentifier
的=
重载:
func check(testInstance: CustomClass) -> Bool {
return array1.contains(where: { $0 === testInstance })
}
还要注意,我们在过滤器{…}.count>0上使用contains(其中:)
,因为前者会在找到匹配元素时短路,而后者会计算整个序列(并创建不必要的中间数组)
直接使用==
执行对象的身份比较可能已经奏效,因为CustomClass
最终继承自NSObject
,它通过定义调用符合equalable
,默认情况下执行身份比较
但是,通常不应依赖于此–可以重写isEqual(:)
的实现,以基于属性值而不是标识执行比较。此外,语义上的equalable
要求=
的实现基于所比较实例的所有可见方面(即属性值)
发件人:
相等意味着可替换性——任何两个比较的实例
可以在任何代码中互换使用,这取决于它们的
价值观要保持可替换性,=
运算符应考虑
说明均衡类型的所有可见方面
因此,在类上使用==
进行身份比较从来都是不正确的,即使它最初可能是有效的
至于何时应该使用ObjectIdentifier
,实际上,您永远不应该仅仅为了执行身份比较而需要它。对于类,您应该使用==
操作符,对于元类型,您应该只使用专门为它们定义的重载(在这种情况下,标识正好相等,因为每个新的元类型实例都是唯一的)
ObjectIdentifier
的主要用途实际上是它的hashValue
实现,它是从初始化对象的指针值派生出来的。这可能很有用,例如,允许元类型成为字典
键(比较)。基本上是==
,请参见:@Hamish identity comparison,而不是查找properties@Crashalot所以它继承自NSObject
?如果您命令单击=
操作符,Xcode将带您进入正在调用的重载。@Crashalot随后从NSObject
:)继承,因此isEqual(:)
的实现可能是您需要查看的地方。@Hamish yup,刚才命令按您的建议单击了吗,而且似乎使用了NSObject
中的=
功能。如此出色的响应,希望我能给你10倍的分数:)是包含的swift 3的新功能吗?以前有人建议使用过滤器
,但可能是在包含
之前?再次感谢@克拉沙洛特很乐意帮忙!而contains
在Swift 1的时代就已经存在了:)尽管当时它是一个顶级函数–它成为了Swift 2中Sequence(Type)
的一个实例方法。该死的你和你的23K点知识!你拿走了使用过滤器而不是包含的唯一好借口!现在剩下的就是“糟糕的开发者”哈哈哈。:)再次感谢!