Swift 为我们提供了两个相等运算符 == 和 ===,它们的作用略有不同。在日常的开发中你肯定需要使用它们,因此今天我们花时间来学习一下。
首先, == 是相等运算符,它测试两个值是否相等,强调的是 “值”类型。例如, 5 == 5 为 true,因为 == 表示整数比较,对于其他内置值类型(例如字符串、布尔值和浮点数)也是如此,比如:
let a = 1.5
let b = 1.5
print(a == b) // true
那么我们平时自定义的 Struct(结构体),用 == 来比较时,事情会变得更加复杂,因为默认情况下它们无法进行比较,这时候如果用 == 来比较,你需要使它们遵守 Equatable 协议。
struct MyStruct {
var name: String
}
let s1 = MyStruct(name: "iOS 新知")
let s2 = MyStruct(name: "iOS 新知")
print(s1 == s2)
以上代码会报错,因为 MyStruct 没有遵守 Equatable 协议,让我们遵守 Equatable 协议:
extension MyStruct: Equatable {
static func == (lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.name == rhs.name
}
}
此时编译器不再报错,print(s1 == s2) 将会打印 true。
相比之下,=== 是恒等运算符,它检查一个类的两个实例是否指向同一内存,强调的是 “类”类型。我们用下边这个例子来说明。
class MyClass {
var name: String
init(name: String) {
self.name = name
}
}
let s1 = MyClass(name: "iOS 新知")
let s2 = MyClass(name: "iOS 新知")
let s3 = s1
print(s1 === s2)
print(s1 === s3)
第一行 print 会打印 false,因为 s1 和 s2 是两个不同的内存地址。 第二行 print 会打印 true,因为 s1 和 s3 是两个相同的内存地址
=== 运算符仅在使用类时才可用,在结构体上使用会报错,因为对于结构体来说,在设计上它们始终有唯一的引用。
点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!