2024-02-16 06:00:05

==和===的差值

在swift中,似乎有两个相等运算符:双等号(==)和三重等号(===),两者之间的区别是什么?


当前回答

在swift 3及以上

===(或!==)

检查两个值是否相同(都指向相同的内存地址)。 比较引用类型。 Like ==在Obj-C(指针相等)。

==(或!=)

检查值是否相同。 比较值类型。 就像Obj-C行为中的默认isEqual:一样。

这里我比较了三个实例(类是引用类型)

class Person {}

let person = Person()
let person2 = person
let person3 = Person()

person === person2 // true
person === person3 // false

其他回答

!==和===是标识符,用于确定两个对象是否具有相同的引用。

Swift还提供了两个标识操作符(===和!==),用于测试两个对象引用是否都引用同一个对象实例。

摘自:苹果公司《快速编程语言》。“iBooks。https://itun.es/us/jEUH0.l

在Swift中,我们有===符号,这意味着两个对象都引用同一个引用同一个地址

class SomeClass {
var a: Int;

init(_ a: Int) {
    self.a = a
}

}

var someClass1 = SomeClass(4)
var someClass2 = SomeClass(4)
someClass1 === someClass2 // false
someClass2 = someClass1
someClass1 === someClass2 // true

==用于检查两个变量是否相等 2 == 2。但是在===的情况下,它代表相等,即如果两个实例引用同一个对象示例,在类的情况下,一个引用被创建,由许多其他实例持有。

Swift 4:另一个使用单元测试的例子,它只适用于===

注意:下面的测试使用==失败,使用===有效

func test_inputTextFields_Delegate_is_ViewControllerUnderTest() {

        //instantiate viewControllerUnderTest from Main storyboard
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        viewControllerUnderTest = storyboard.instantiateViewController(withIdentifier: "StoryBoardIdentifier") as! ViewControllerUnderTest 
        let _ = viewControllerUnderTest.view

        XCTAssertTrue(viewControllerUnderTest.inputTextField.delegate === viewControllerUnderTest) 
    }

这门课就是

class ViewControllerUnderTest: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var inputTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        inputTextField.delegate = self
    }
}

在单元测试中,如果使用==,则二进制操作符“==”不能应用于类型为“UITextFieldDelegate?”和“ViewControllerUnderTest!”

例如,如果你创建一个类的两个实例,例如myClass:

var inst1 = myClass()
var inst2 = myClass()

你可以比较这些例子,

if inst1 === inst2

引用:

用于测试两个对象引用是否都引用 相同的对象实例。

摘自:苹果公司《快速编程语言》。“iBooks。https://itun.es/sk/jEUH0.l