通過擴展自動合成 Swift 結構或枚舉的 Equatable 一致性

考爾K

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

這也是。

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

extension Outcome: Equatable {}

print(Outcome.failure(reason: "Chance") == Outcome.failure(reason: "Chance"))   // prints true

有誰知道這個功能在哪裡記錄。

謝謝。

掃地機

綜合提案 ( SE-0185 ) 與您鏈接的文檔有所不同:

用戶必須通過將其類型聲明為 Equatable 或 Hashable 來選擇加入自動合成,而無需實現他們的任何要求。這種一致性必須是原始類型聲明的一部分或同一文件中的擴展名(以確保可以從擴展名訪問 private 和 fileprivate 成員)。

根據提案,在同一文件中的擴展中聲明一致性也會自動生成所需的成員,這符合實際行為。如果您在與類型不同的文件中聲明擴展名,您應該會看到一條錯誤消息:

文件聲明結構“Point”之外的擴展會阻止協議“Equatable”自動合成“==”

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章