【问题标题】:Equality of arrays with reference and type members in SwiftSwift 中具有引用和类型成员的数组的相等性
【发布时间】:2016-07-02 23:15:10
【问题描述】:

我有一个名为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)的身份吗?
  • 如果是这样,我是否需要在以下代码中为Person 类遵守Equatable 协议:

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

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 很好的解释。您能否扩展您的答案以解释如果输入数组[Any] 会发生什么?
    • @AaronBrager:谢谢。我添加了[Any]的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多