swift - 为什么需要在类外定义可等式协议(protocol)?

标签 swift hashable

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

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 == 呢??

最佳答案

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

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

关于swift - 为什么需要在类外定义可等式协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24819776/

相关文章:

ios - 如何使用 ScrollView 制作可滚动标签?

swift - XCTestExpectation 似乎在 Task() 中不起作用

swift - 如何使具有可选属性的自定义类符合 "hashable"协议(protocol)

ios - 正确的segue流程

ios - 在 TabBarController 中使用相同的 ViewController 和 TableView

ios - 在主线程中初始化一个变量

objective-c - NSObject 是 Hashable 但采用 NSObject 的协议(protocol)不是?

swift - 如何在 Swift 中实现 Image 的 Hashable 结构

swift - 如何使用两个枚举变量实现 Identifiable