Можете ли вы одновременно выполнять сопоставление с образцом и одновременно разворачивать кортеж, содержащий дополнительные элементы? - PullRequest
0 голосов
/ 26 октября 2018

Попытка сделать что-то вроде этого ...

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 голосов
/ 26 октября 2018

Вам необходим «необязательный шаблон» 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)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...