Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用';案例';直接返回结果的模式匹配_Swift_Enums_Switch Statement_Pattern Matching - Fatal编程技术网

Swift 使用';案例';直接返回结果的模式匹配

Swift 使用';案例';直接返回结果的模式匹配,swift,enums,switch-statement,pattern-matching,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(

这是我的代码:

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
}
但正如我们所看到的,它花费了我额外的代码行。我希望它能起作用,因为在斯威夫特,只有布尔人是被允许的。说:

if语句中任何条件的值都必须是Bool类型或 连接到布尔的类型

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

case ServerResponse.ok = response

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

您只需使
enum
符合
equalable
,然后您甚至不需要该实例,您只需使用
=
检查
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)

您只需使您的
enum
符合
equalable
,然后您甚至不需要大小写,您只需使用
=
检查
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)
func-isOk(response:ServerResponse)->Bool{guard case.ok=response-else{return false}return true}func-isOk(response:ServerResponse)->Bool{guard case.ok=response-else{return false}返回true}