通过扩展自动合成 Swift 结构或枚举的 Equatable 一致性

Kha*_*r K 5 swift equatable

Swift 文档表示,Equatable只有在结构体或枚举的原始定义中声明了一致性,而不是通过扩展声明一致性时,一致性的自动合成才可用于结构体和具有关联值的枚举,在这种情况下,运算符的实现==必须是假如。

文档链接

但是,以下代码可以工作。

struct Point {
    var x: Double
    var y: Double
}

extension Point: Equatable {}

print(Point(x: 10, y: 10) == Point(x: 5, y: 5))   // prints false
Run Code Online (Sandbox Code Playgroud)

这也是如此。

enum Outcome {
    case success
    case failure(reason: String)
}

extension Outcome: Equatable {}

print(Outcome.failure(reason: "Chance") == Outcome.failure(reason: "Chance"))   // prints true
Run Code Online (Sandbox Code Playgroud)

有谁知道这个功能在哪里记录。

谢谢。

Swe*_*per 4

合成提案(SE-0185)的内容与您链接的文档有所不同:

用户必须通过将其类型声明为 Equatable 或 Hashable 来选择自动合成,而无需实现其任何要求。此一致性必须是原始类型声明的一部分或同一文件的扩展中(以确保可以从扩展中访问 private 和 fileprivate 成员)。

根据该提案,在同一文件中声明扩展的一致性也会自动生成所需的成员,这与实际行为一致。如果您在与类型不同的文件中声明扩展名,您应该会看到一条错误消息:

声明结构“Point”的文件外部扩展阻止协议“Equatable”自动合成“==”