Swift 中具有引用和类型成员的数组相等

Equality of arrays with reference and type members in Swift

我有一个名为 Person 的 class 和两个包含值和引用类型成员的数组。我想检查这些数组是否相等:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var firstPerson = Person("John")
var secondPerson = Person("James")
var firstArray = ["firstWord", firstPerson, 12]
var secondArray = ["firstWord", secondPerson, 12]
print(firstArray == secondArray)

Swift 编译器将如何比较这些数组?

顺便问一下,为什么 == 函数必须在 Person class 之外声明才能正常工作?

func ==(lhs: Person, rhs: Person) -> Bool {
    let areEqual = lhs.name == rhs.name
    return areEqual
}

I'm not 100% sure about this. Should you find some errors please let me know.

首先这个编译不了

var firstPerson = Person("John")
var secondPerson = Person("James")

应该是

var firstPerson = Person(name: "John")
var secondPerson = Person(name: "James")

Swift 将如何比较这些数组?

firstArraysecondArray 被推断为 NSArray,因为您将不同类型的值放入其中并且您没有明确声明它们为 [Any]

当您编写 firstArray == secondArray 时,代码会以这种方式桥接到 Objective-C

firstArray.isEqualToArray(secondArray as [AnyObject])

isEqualToArray 方法检查每个元素是否相等。

[0]

"firstWord" == "firstWord"

转换为

("firstWord" as NSString).isEqual("firstWord" as NSString)

并且是 true.

[1]

两个数组引用同一个 Person 对象,所以它是 true

[2]

12 == 12

转换为

(12 as NSNumber).isEqual(NSNumber(int: 12)) 

也就是 true.

回顾

所以数组比较的结果是true.

如果数组声明为 [Any] 会发生什么?

在这种情况下,没有 Objective-C 桥接。 在 Swift 中,如果相关类型是 Equatable,我们可以检查 2 个数组是否相等。因为 Any 不是 Equatable 我们会得到一个编译器错误。

firstArray == secondArray
Binary operator `==` cannot be applied to two [Any] operands