这是我的代码:

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
}

但正如我们所看到的,它花费了我额外的代码行。我希望它能起作用,因为在斯威夫特,只有布尔人是允许的。The docs说:
if语句中任何条件的值必须是Bool或
连接到布尔的类型
这意味着该行的计算结果应为布尔值,因为上面的代码是编译的,并且该行代码是if语句中的条件:
case ServerResponse.ok = response

为什么我不能用它直接返回方法中的布尔值(问题中的第一个代码)?有没有一行程序检查给定的枚举属性是否为给定的枚举大小写?

最佳答案

你只需要让你的enum符合Equatable,然后你甚至不需要这个案例,你可以简单地使用==来检查你的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
}

那就叫它:ServerResponse.isOk(response: .resend)

09-26 05:12