【问题标题】:Why a equatable protocol needs to be defined outside the class?为什么需要在类之外定义一个等价协议?
【发布时间】:2014-09-09 06:47:45
【问题描述】:

当我实现 Hashable 协议时。需要在类外部定义一个等价的协议函数,如下所示。如下。

func ==(lhs: Swap, rhs: Swap) -> Bool {
    return (lhs.cookieA == rhs.cookieA && lhs.cookieB == rhs.cookieB) ||
        (lhs.cookieB == rhs.cookieA && lhs.cookieA == rhs.cookieB)
}

class Swap: Printable,Hashable {
    var cookieA: Cookie
    var cookieB: Cookie

    init(cookieA: Cookie, cookieB: Cookie) {
        self.cookieA = cookieA
        self.cookieB = cookieB
    }
    var hashValue: Int {
    return cookieA.hashValue ^ cookieB.hashValue
    }

    var description: String {
    return "swap \(cookieA) with \(cookieB)"
    }
}

这对我来说有点奇怪。在上面的例子中 func == 应该属于 Swap 类。那么为什么我们需要在类外声明 func == 呢??

【问题讨论】:

标签: swift hashable


【解决方案1】:

主要是因为它是一个函数,而不是一个方法。函数独立于类,因此在类声明中限定它们是没有意义的。

协议可以设计有方法,例如使用obj1.isEqualTo(obj2) 方法,但函数对nil 问题不太敏感。如果obj1nil,则该方法将失败。

【讨论】:

    【解决方案2】:

    我不会过多地阅读它。我认为这只是一个简单的设计决定。是的,在许多语言中,运算符重载是左侧操作数上的方法,这很好,但是将运算符定义为函数可能会给您更多的灵活性,因此他们决定将它们全部设为函数。

    【讨论】:

      【解决方案3】:

      运算符函数被定义为一个全局函数,其函数名称与要重载的运算符相匹配。 该函数是全局定义的,而不是作为目标类或结构上的方法,因此它可以用作目标类或结构的现有实例之间的中缀运算符。

      我已经在我的博文here 中详细回答了这个问题。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 2013-10-29
        • 2015-12-26
        • 1970-01-01
        相关资源
        最近更新 更多