3

我正在快速学习并阅读有关扩展中的运算符重载的主题,其中包括:

extension StreetAddress: Equatable {
    static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
        return
            lhs.number == rhs.number &&
            lhs.street == rhs.street &&
            lhs.unit == rhs.unit
    }
}

但是我怎么知道我需要采用 Equatable 呢?

我试图删除该协议,并且该功能的工作方式相同。不会报告任何警告或错误。为什么?

4

1 回答 1

4

引用苹果文档

要采用 Equatable 协议,请将等于运算符 (==) 实现为您类型的静态方法

因此实现Equatable意味着您必须重载==运算符,因此这是一个构建错误:

extension StreetAddress: Equatable {
}

重载 == 运算符不需要也不与严格相关Equatable,例如:

class StreetAddress {
    var theAddress:String?

    static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
        return lhs.theAddress?.lowercased() == rhs.theAddress?.lowercased()
    }
}
于 2017-12-15T02:43:05.863 回答