Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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 为什么==和===相等似乎对UIView类同样有效?_Ios_Swift_Uiview_Uikit_Equality - Fatal编程技术网

Ios 为什么==和===相等似乎对UIView类同样有效?

Ios 为什么==和===相等似乎对UIView类同样有效?,ios,swift,uiview,uikit,equality,Ios,Swift,Uiview,Uikit,Equality,我正在试图找出何时应该使用===来比较UIView。我意识到我一直在使用==而没有真正考虑UIView是一种引用类型。但是它从来没有给我带来任何问题,所以看起来UIViews从来就不需要=== 我对value compare==和identity compare==的理解是,对于类,需要使用===知道是否有相同的实例,以及==知道它们是否有相同的值。但是,对于UIView类,==似乎与===运算符的工作方式完全相同 let v1 = UIView() let v2 = UIView() XCTA

我正在试图找出何时应该使用===来比较UIView。我意识到我一直在使用==而没有真正考虑UIView是一种引用类型。但是它从来没有给我带来任何问题,所以看起来UIViews从来就不需要===

我对value compare==和identity compare==的理解是,对于类,需要使用===知道是否有相同的实例,以及==知道它们是否有相同的值。但是,对于UIView类,==似乎与===运算符的工作方式完全相同

let v1 = UIView()
let v2 = UIView()
XCTAssertTrue(v1 === v1)
XCTAssertTrue(v1 == v1)
XCTAssertTrue(v1.isEqual(v1))

XCTAssertFalse(v1 === v2)
XCTAssertTrue(v1 == v2)
XCTAssertTrue(v1.isEqual(v2))
基于这种理解,我希望这些都能通过。要知道v1和v2是否是不同的实例,我应该使用===,并且==应该为true,因为它们具有相同的属性值。然而,事实并非如此

==和===都为false。这些不应该有不同的工作方式吗?这些视图具有相同的特性值


UIView是否使用===实现equalable?没有理由在UIView上使用===吗?

两个不同的
UIView
实例不太可能具有相同的所有属性和属性

当您使用
=
比较两个不同的单独实例
UIView
(具有不同的值)时,将始终返回false,除非您符合
equalable
协议并提供自定义相等标准


另外,
==
返回false,因为它们的引用具有不同的堆位置。

这是因为默认情况下,Objective-C对象的
==
==
。否则(例如,逐属性比较),您需要重写
isEqual:
,但Cocoa类通常不这样做。(NSString之类的基础类显然是这样做的;重要的是字符串的字符,而不是它的存储位置。)

“UIView是否使用===实现equalable”我不确定,但这似乎很合理。我真的无法想象你们会如何定义两个视图的相等。所以一般来说,对于任何NSObject子类,我都不需要使用===,除非我知道它以某种方式覆盖了isEqual?我想这是有道理的。它在Swift中的工作方式是Swift
=
默认为
isEqual
;但是在Objective-C/Cocoa中,
isEqual
默认为对象相等,这就是
=
的含义。但是你不应该依靠欺骗;编写代码的方法就是说出你的意思。如果您的意思是“相等”,请使用
==
。如果您的意思是“相同的对象”,请使用
=