使用“案例”模式匹配直接返回结果

时间:2019-07-30 19:47:05

标签: swift enums switch-statement pattern-matching

这是我的代码:

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类型或   桥接到布尔的类型

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

case ServerResponse.ok = response

为什么我不能使用它直接在方法内部返回布尔值(问题中的第一个代码)?是否有任何一个内联器检查给定的枚举属性是否为给定的枚举大小写?

1 个答案:

答案 0 :(得分:0)

您只需要使您的enum符合Equatable,那么您甚至不需要这种情况,只需使用==来检查您的{{1} }变量是一个具体情况。

enum

与您的问题无关,但是将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 }