2

当我实现 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 == 呢?

4

3 回答 3

7

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

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

于 2014-07-18T08:02:09.917 回答
1

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

于 2014-07-18T08:20:26.143 回答
1

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

我已经在我的博文中详细回答了这个问题。希望能帮助到你。

于 2016-05-17T13:37:23.210 回答