很快就有两个相等运算符:double equals( == )和Triple equals( === ),两者之间有什么区别?
==
===
简而言之:
== 操作员检查其实例值是否相等, "equal to"
"equal to"
=== 操作员检查引用是否指向同一实例, "identical to"
"identical to"
长答案:
类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, == 这意味着它们的实例是否彼此相等。它不必是相同的实例才能相等。为此,您需要为自定义类提供一个相等条件。默认情况下,自定义类和结构不接受等效运算符的默认实现,即“等于”运算符 == 和“不等于”运算符 != 。为此,您的自定义类需要遵循 Equatable 协议及其 static func == (lhs:, rhs:) -> Bool功能
!=
Equatable
static func == (lhs:, rhs:) -> Bool
让我们看一个例子:
class Person : Equatable { let ssn: Int let name: String init(ssn: Int, name: String) { self.ssn = ssn self.name = name } static func == (lhs: Person, rhs: Person) -> Bool { return lhs.ssn == rhs.ssn } }
P.S.: 由于ssn(社会安全号码)是唯一的号码,因此您无需比较其名称是否相等。
P.S.:
let person1 = Person(ssn: 5, name: "Bob") let person2 = Person(ssn: 5, name: "Bob") if person1 == person2 { print("the two instances are equal!") }
尽管person1和person2引用指向Heap区域中的两个不同实例,但是它们的实例相等,因为它们的ssn编号相等。所以输出将是the two instance are equal!
the two instance are equal!
if person1 === person2 { //It does not enter here } else { print("the two instances are not identical!") }
=== 操作员检查引用是否指向相同的实例 "identical to" 。由于person1和person2在堆区域中有两个不同的实例,因此它们并不相同,并且输出the two instance are not identical!
the two instance are not identical!
let person3 = person1
P.S: 类是引用类型,并且通过此分配操作将person1的引用复制到person3,因此两个引用都在Heap区域中指向同一实例。
P.S:
if person3 === person1 { print("the two instances are identical!") }
它们是相同的,输出将是 the two instances are identical!
the two instances are identical!