Swift ==和===的区别

505 阅读2分钟

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 MyStructEquatable {
    static func == (lhsMyStructrhsMyStruct) -> 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新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!