swift - 你能同时进行模式匹配和解包一个包含可选值的元组吗?

标签 swift switch-statement pattern-matching tuples option-type

尝试做这样的事情......

func test(a:Int?, b:Int?){

    switch (a, b) {

        case     (nil, nil) : print("Neither")
        case let (aa,  nil) : print("A-only: \(aa)")
        case let (nil, bb ) : print("B-only: \(bb)")
        case let (aa,  bb ) : print("A and B: \(aa) & \(bb)")
    }
}

在上面的地方,aabb 都已经解包了。

我能想到的最接近的是...

func test(a:Int?, b:Int?){

    switch (a, b) {

        case (nil, nil) : print("Neither")
        case (  _, nil) : print("A-only: \(a!)")
        case (nil,   _) : print("B-only: \(b!)")
        default         : print("A and B: \(a!) & \(b!)")
    }
}

...但我真的很讨厌我有这样明确解包的值。

那么这可以做到吗?

最佳答案

您需要“可选模式”x?:

func test(a:Int?, b:Int?) {

    switch (a, b) {

    case (nil, nil) : print("Neither")
    case (let aa?,  nil) : print("A-only: \(aa)")
    case (nil, let bb?) : print("B-only: \(bb)")
    case (let aa?, let bb?) : print("A and B: \(aa) & \(bb)")
    }
}

x?.some(x) 的快捷方式,所以你可以这样写 作为

func test(a:Int?, b:Int?) {

    switch (a, b) {

    case (nil, nil) : print("Neither")
    case (let .some(aa), nil) : print("A-only: \(aa)")
    case (nil, let .some(bb)) : print("B-only: \(bb)")
    case (let .some(aa), let .some(bb)) : print("A and B: \(aa) & \(bb)")
    }
}

正如@vacawama 所说,您还可以将 let 移到模式的外部:

    case let (aa?,  nil) : print("A-only: \(aa)")
    case let (nil, bb?) : print("B-only: \(bb)")
    case let (aa?, bb?) : print("A and B: \(aa) & \(bb)")

关于swift - 你能同时进行模式匹配和解包一个包含可选值的元组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001077/

相关文章:

ios - Xcode 更新 6.1.1 后构建失败

C# 开关与 VB 案例语句

c++ - 计算#define的简洁方法

javascript - JS正则表达式匹配具有特定特殊字符且没有连续空格的用户名

android - 歌曲识别算法

ios - 使用 Swift 在 Firebase 中检索子数组

swift - 未使用初始化程序的结果?

swift - `JSONSerialization.data` 类型声明明显不一致

c# - 编写一个switch语句,其中一个包含另一种情况

java - 在java中使用正则表达式与不可打印的字符