【问题标题】:Use 'case' pattern matching to directly return result使用 'case' 模式匹配直接返回结果
【发布时间】:2019-07-30 19:47:05
【问题描述】:

这是我的代码:

enum ServerResponse {
    case ok, error(Error), rawError(String), resend

    func isOk(response: ServerResponse) -> Bool {
        case ServerResponse.ok = response
    }
}

它没有编译并出现以下错误:

“case”标签只能出现在“switch”语句中

这很奇怪,因为这是允许的:

func isOk(response: ServerResponse) -> Bool {
    if case ServerResponse.ok = response {
        return true
    }

    return false
}

但正如我们所看到的,这会花费我额外的代码行。我希望它能够工作,因为在 Swift 中,只允许使用布尔值。 The docs说:

if 语句中任何条件的值必须是 Bool 类型 或 一种桥接到 Bool 的类型

这意味着该行应该计算为布尔值,因为上面的代码可以编译,并且该代码行是 if 语句中的条件:

case ServerResponse.ok = response

为什么我不能使用它直接在方法中返回布尔值(问题中的第一个代码)?是否有任何 oneliner 可以检查给定的枚举属性是否是给定的枚举案例?

【问题讨论】:

  • 两班:func isOk(response: ServerResponse) -> Bool { guard case .ok = response else { return false } return true }

标签: swift enums switch-statement pattern-matching


【解决方案1】:

你只需要让你的enum符合Equatable,那么你甚至不需要case,你可以简单地使用==来检查你的enum变量是否是一个具体的case。

enum ServerResponse {
    case ok, error(Error), rawError(String), resend

    func isOk(response: ServerResponse) -> Bool {
        return response == .ok
    }
}

extension ServerResponse: Equatable {
    static func == (lhs: ServerResponse, rhs: ServerResponse) -> Bool {
        switch (lhs, rhs) {
        case ( .ok, .ok):
            return true
        case (.resend, .resend):
            return true
        case (.rawError(let string), .rawError(let otherString)):
            return string == otherString
        case (.error(_), .error(_)):
            return true
        default:
            return false
        }
    }   
}

与您的问题无关,但将 isOk 定义为实例方法并使其接受输入参数没有意义。要么不传入response,而直接使用self == .ok,要么将函数设为类型方法,然后传入值。

实例方法:

func isOk() -> Bool {
    return self == .ok
}

然后这样称呼它:ServerResponse.ok.isOk()

类型方法:

static func isOk(response: ServerResponse) -> Bool {
    return response == .ok
}

然后这样称呼它:ServerResponse.isOk(response: .resend)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2021-08-06
    相关资源
    最近更新 更多