您既可以同时进行模式匹配,又可以解开包含可选元素的元组?

时间:2018-10-26 03:41:16

标签: swift switch-statement pattern-matching tuples optional

试图做这样的事情...

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!)")
    }
}

...但是我真的很讨厌我像这样显式地解开了值。

那可以做到吗?

1 个答案:

答案 0 :(得分:2)

您需要“可选模式” 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)")
相关问题