Swift

时间:2016-07-02 23:15:11

标签: arrays swift pass-by-reference pass-by-value

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

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编译器如何比较这些数组?

  • 是否会检查数组的第一个成员("firstWord")是否相等,然后检查第二个成员(firstPersonsecondPerson)的身份?
  • 如果是这样,我是否需要在以下代码中符合Equatable类的Person协议:

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

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

1 个答案:

答案 0 :(得分:1)

  

我对此并不是100%肯定。如果您发现一些错误,请告诉我。

首先,这不会编译

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