Можете ли вы одновременно сопоставить с образцом и развернуть кортеж, содержащий необязательные элементы?

Пытаюсь сделать что-то подобное ...

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

где в приведенном выше примере и aa, и bb уже развернуты.

Самое близкое, что я мог придумать, это ...

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
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам понадобится «необязательный шаблон» 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)")

Или case let (aa?, bb?) для последнего.

vacawama 26.10.2018 05:51
let (aa?, nil) работает и в других случаях. Или let (.some(a), nil)
Martin R 26.10.2018 05:52

Другие вопросы по теме