【问题标题】:Equatable with enum - Swift与枚举相等 - Swift
【发布时间】:2019-08-28 12:39:35
【问题描述】:

如何验证以下源代码是否相等?

enum ErrorAPI: Equatable, Error {
    case CannotFetch(String)
}

func ==(lhs: ErrorAPI, rhs: ErrorAPI) -> Bool {
    switch (lhs, rhs) {
    case (.CannotFetch(let a), .CannotFetch(let b)) where a == b:
        return true
    default:
        return false
    }
}

【问题讨论】:

  • 你在问这段代码是如何工作的吗?或者你想要一个不同的方程解法?
  • 是的。 -> 你是在问这段代码是如何工作的
  • @乔金丹尼尔森。我的函数出现错误,当我从你的代码中使用 let err1 = ErrorAPI.CannotFetch("abc") let err2 = ErrorAPI.CannotFetch("abc") print(err1 == err2),说我二元运算符 '= ='不能应用于'Error'和'ErrorAPI'类型的操作数
  • 您使用的是哪个 Xcode/Swift 版本?在 Swift 4 及更高版本中,编译器会自动为 Equatable 一致性合成 == 运算符,即使对于具有关联值的枚举也是如此。
  • 请不要在cmets中描述问题,而是edit您的问题并添加minimal reproducible example

标签: swift enums


【解决方案1】:

枚举案例CannotFetch 有一个String 类型的关联值。这意味着,当枚举案例设置为CannotFetch 时,特定的字符串与该案例相关联。如果您需要了解关联值,请通读official Swift documentation about Enumerations

func ==() 方法是所谓的Equivalence Operator。您可以在official Swift documentation about Advanced Operators 中了解更多信息。

当比较两个枚举时,我们称它们为enumOneenumTwo,如果两种情况都是CannotFetch(String),则实现此函数以便能够比较这两个枚举。

例子:

let enumOne = ErrorAPI.CannotFetch("Hi")
let enumTwo = ErrorAPI.CannotFetch("Hello")

if enumOne != enumTwo {
    print("They are not equal!")
} else {
    print("They are equal")
}

case (.CannotFetch(let a), .CannotFetch(let b)) where a == b: 行的工作方式如下:

  1. 只有在 enumOne 和 enumTwo 都设置为CannotFetch(String) 的情况下才会继续这种情况
  2. 获取左侧枚举的关联值 (=String),即 "Hi",并将其分配给新常量 let a
  3. 获取左侧枚举的关联值(=String),即"Hello",并将其分配给新常量let b
  4. 另外,检查常量ab后面的值是否相等,即检查字符串HiHello是否相等。
  5. 如果这一切都是真的,执行case中的代码块,即return true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2015-03-07
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多