Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 快速平等需要客观识别器?_Ios_Swift_Skspritenode_Sknode - Fatal编程技术网

Ios 快速平等需要客观识别器?

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,

我们有一个自定义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
未实现
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点知识!你拿走了使用
过滤器而不是
包含
的唯一好借口!现在剩下的就是“糟糕的开发者”哈哈哈。:)再次感谢!