【问题标题】:Equality operator overload not working as expected等式运算符重载未按预期工作
【发布时间】:2017-03-23 08:34:46
【问题描述】:

在意识到 Swift 不知道如何比较数字对(作为 Int 的元组)之后。我用以下代码定义了一个类:

import Foundation

class NumberPair: NSObject {
    var row,column:Int!

    init(_ theRow: Int, _ theCol: Int) {
        row = theRow
        column = theCol
        super.init()
    }

    convenience override init() {
        self.init(0,0)
    }

    static func == (lhs: NumberPair, rhs: NumberPair) -> Bool {
        return (lhs.row == rhs.row) && (lhs.column == rhs.column)
    }

    static func != (lhs: NumberPair, rhs: NumberPair) -> Bool {
        return (lhs.row != rhs.row) || (lhs.column != rhs.column)
    }
}

然后在使用类时我有这样的东西:

var firstArray = [NumberPair](), secondArray = [NumberPair]()
...........................
// Some code working fine that fills up firstArray and secondArray.
...........................

for pairItem in firstArray {
    if secondArray.index(of: pairItem) != nil {
        print("We found an item that is in both arrays.")
        break
    }
}

现在我的问题是这个。上面的代码不起作用。我的意思是,尽管我确定 2 个数组 firstArray 和 secondArray 包含常见的数字对,但消息永远不会被打印出来。怎么了?我错过了一些明显的东西吗?任何提示将不胜感激。

【问题讨论】:

  • 参见stackoverflow.com/a/42286148/2976878 的第 2 点——子类不能重新实现它们的超类(NSObject)协议的实现(Equatable)。如前所述,解决方案是覆盖isEqual(_:)(你也应该覆盖hash)。
  • @Hamish 很好的答案。

标签: swift operator-overloading


【解决方案1】:

如果你真的想继承NSObject,请使用isEqual

    class NumberPair: NSObject {
    public var row,column:Int!

    init(_ theRow: Int, _ theCol: Int) {
        row = theRow
        column = theCol
        super.init()
    }

    override func isEqual(_ object: Any?) -> Bool {
        guard let comparingObject = object as? NumberPair else {
            return false
        }
        return row == comparingObject.row && column == comparingObject.column
    }
}

以上任何一种,或者只是从NSObject 中删除继承并符合Equatable 协议。

class NumberPair: Equatable {
    public var row,column:Int!

    init(_ theRow: Int, _ theCol: Int) {
        row = theRow
        column = theCol
        //super.init()
    }



    static func == (lhs: NumberPair, rhs: NumberPair) -> Bool {
        return (lhs.row == rhs.row) && (lhs.column == rhs.column)
    }

    static func != (lhs: NumberPair, rhs: NumberPair) -> Bool {
        return (lhs.row != rhs.row) || (lhs.column != rhs.column)
    }
}

【讨论】:

  • 很好用。我在网上找到了关于 == 的信息,但没有找到关于 isEqual 的信息。也许我没有寻找正确的方法。所以现在我看到自己实现 Equatable 和从 NSObject 继承是解决问题的两种方法。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2022-12-18
  • 2015-05-11
  • 2019-06-20
相关资源
最近更新 更多