高级模式匹配Swift



是否可以在switch-case分支中使用选项?例如:某些功能f(arg:)返回String?。当f(arg:)返回非nil值并使用此值时,我们需要执行一些switch-case分支。请参阅以下示例。

func f(arg: Int) -> String?
let someValue: Int = ...
switch someValue {
    case -3, -2, -1:
        print("error: negative")
    case 10, 11, 12:
        print("error: too big")
    case let value, let str = f(arg: value): // HOW ????
        print("success: non-nil string (str)")
    default:
        print("fail")    
}

我认为您的switch语句等同于此:

switch someValue {
    case -3, -2, -1:
        print("error: negative")
    case 10, 11, 12:
        print("error: too big")
    default:
        if let str = f(arg: someValue) {
            print("success: non-nil string (str)")
        } else {
            print("fail")
        }
}

但是,一种使用guard语句的清洁方式,因此您知道someValue在将其传递给函数之前是有效的:

guard case 0...9 = someValue else {
    print("someValue is outside of valid range")
    // Handle error
    return
}
if let str = f(arg: someValue) {
    print("success: non-nil string (str)")
} else {
    print("fail")
}

另一种选择是如果参数不在预期范围内,则简单地使f返回nil

func f(arg: Int) -> String? {
    guard case 0...9 = arg else {
        print("(arg) is not in the valid range of 0...9")
        return nil
    }
    // ...
}
if let str = f(arg: someValue) {
    print("success: non-nil string (str)")
} else {
    print("fail")
}

旧一个,但这可能是您想要的:

func f(arg: Int) -> String?
let someValue: Int = ...
switch (someValue, f(arg: value)) {
    case (-3 ... -1, _):
        print("error: negative")
    case (10...12, _):
        print("error: too big")
    case (_, let str?):
        print("success: non-nil string (str)")
    default:
        print("fail")    
}

最新更新