Опитвам се да използвам съвпадение на шаблони в превключващо изявление с tuple, за да изразя ясно всички случаи, при които преброяването не е равно на един конкретен случай. Това е съкратена версия на моята декларация за превключване:
switch (source, type, status) {
case (.cashVoucher, _, .awaitingValidation):
return cashVoucherAwaitingValidationMessageComponants
case (.cashVoucher, _, != .awaitingValidation):
return validatedCashVoucherMessageComponants
default:
fatalError("")
}
Това не се компилира очевидно поради неправилното използване на оператора!
Искам първият случай да съвпада с източник .cashVoucher
и статут на .awaitingValidation
.
Искам вторият случай да съвпада с източник .cashVoucher
и всеки статут, с изключение на .awaitingValidation
.
Има две решения, за които мога да се сетя досега, ноте не са толкова четливи, колкото бих искал. Бих могъл просто да изброя всички други случаи на статут, но има общо 8 и става трудно за четене. case (.cashVoucher, _, _):
и поради реда на случаите на смянаправя това, което аз се опитвам да постигна, но моята декларация за превключване actaully има общо 16 случая и се разчита на реда на случаите на превключване, което затруднява читателя да разбере по мое мнение.
Така че има ли някакъв начин да изразите това, използвайки нещо подобно на != .awaitingValidation
Имам по-горе?
Отговори:
4 за отговор № 1Трябва да можете да го напишете като:
switch (source, type, status) {
case (.cashVoucher, _, let st) where st == .awaitingValidation:
return cashVoucherAwaitingValidationMessageComponants
case (.cashVoucher, _, let st) where st != .awaitingValidation:
return validatedCashVoucherMessageComponants
default:
fatalError("")
}
Така задайте третата стойност на кортежа на константа (тук st
) и употреба where
за проверка на равенството.