【问题标题】:Member operator '==' must have at least one argument of type成员运算符 '==' 必须至少有一个参数类型
【发布时间】:2017-03-18 04:00:57
【问题描述】:

我正在尝试在equalityClass 中实现Equatable 协议,但显示成员运算符'==' 必须至少有一个'eqaualityClass' 类型的参数。谁能解释这里出了什么问题?

protocol Rectangle: Equatable {

    var width: Double { get }
    var height: Double { get }

}

class eqaualityClass:Rectangle{

    internal var width: Double = 0.0
    internal var height: Double = 0.0

      static func == <T:Rectangle>(lhs: T, rhs: T) -> Bool {
          return lhs.width == rhs.width && rhs.height == lhs.height
     }
}

【问题讨论】:

标签: swift swift3


【解决方案1】:

你需要让你的 Rectangle 协议成为一个类。试试这样:

protocol Rectangle: class, Equatable {
    var width: Double { get }
    var height: Double { get }
}

class Equality: Rectangle {
    internal var width: Double = 0
    internal var height: Double = 0
    static func ==(lhs: Equality, rhs: Equality) -> Bool {
        return lhs.width == rhs.width && rhs.height == lhs.height
    }
}

或者简单地说:

protocol Rectangle: Equatable {
    var width: Double { get }
    var height: Double { get }
}

extension Rectangle {
    static func ==(lhs: Self, rhs: Self) -> Bool {
        return lhs.width == rhs.width && rhs.height == lhs.height
    }
}

class Equality: Rectangle {
    internal var width: Double = 0
    internal var height: Double = 0
}

【讨论】:

  • 谢谢它的工作。你能解释一下为什么使用类关键字吗?
【解决方案2】:

更优雅的解决方案:

您可以使用协议扩展让所有采用 Rectangle 协议的类/结构/枚举实体符合 Equatable,如下所示:

protocol Rectangle: Equatable {
    var width: Double { get }
    var height: Double { get }
}

extension Rectangle {
    static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.width == rhs.width && rhs.height == lhs.height
    }
}

【讨论】:

  • Swift 4.1 不综合类类型的一致性。因此,您的答案的第二部分不适用于 OP 的 EqualityClass 类。
  • @LucaAngeletti 感谢您的更正。我已经编辑了答案并删除了误导部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多