Próbuję użyć dopasowania wzorca w instrukcji switch z krotką, aby wyraźnie wyrazić wszystkie przypadki, w których wyliczenie nie równa się jednemu konkretnemu przypadkowi. Oto skrócona wersja mojej instrukcji zmiany:
switch (source, type, status) {
case (.cashVoucher, _, .awaitingValidation):
return cashVoucherAwaitingValidationMessageComponants
case (.cashVoucher, _, != .awaitingValidation):
return validatedCashVoucherMessageComponants
default:
fatalError("")
}
Nie kompiluje to oczywiście z powodu nieprawidłowego użycia operatora! =, Ale daje wyobrażenie o tym, co próbuję osiągnąć.
Chcę, aby pierwszy przypadek pasował do źródła .cashVoucher
i status .awaitingValidation
.
Chcę, aby drugi przypadek pasował do źródła .cashVoucher
i każdy status oprócz .awaitingValidation
.
Są dwa rozwiązania, o których myślę do tej pory, ale„nie są tak czytelne, jak bym chciał. Mógłbym po prostu wymienić wszystkie inne przypadki stanu, ale w sumie jest ich 8 i trudno je odczytać. case (.cashVoucher, _, _):
i ze względu na kolejność przypadków przełącznikówrób to, co próbuję osiągnąć, ale moja instrukcja przełączania ma łącznie 16 przypadków i poleganie na kolejności przypadków przełączania utrudnia czytelnikowi zrozumienie.
Czy jest jakiś sposób na wyrażenie tego za pomocą czegoś podobnego do != .awaitingValidation
Mam powyżej?
Odpowiedzi:
4 dla odpowiedzi № 1Powinieneś być w stanie napisać to jako:
switch (source, type, status) {
case (.cashVoucher, _, let st) where st == .awaitingValidation:
return cashVoucherAwaitingValidationMessageComponants
case (.cashVoucher, _, let st) where st != .awaitingValidation:
return validatedCashVoucherMessageComponants
default:
fatalError("")
}
Więc przypisz trzecią wartość krotki do stałej (tutaj st
) I użyć where
sprawdzić równość.