Załóżmy, że mam funkcję, która zwraca opcjonalnie. nil jeśli błąd i wartość, jeśli sukces:swift, opcjonalne rozpakowanie, cofanie, jeśli warunek
func foo() -> Bar? { ... }
mogę użyć poniższy kod do pracy z tej funkcji:
let fooResultOpt = foo()
if let fooResult = fooResultOpt {
// continue correct operations here
} else {
// handle error
}
Jednakże istnieje kilka problemów z tym podejściem do dowolnego kodu nietrywialne:
Obsługa błędów wykonywana w końcu i łatwo jest coś przeoczyć. Znacznie lepiej, gdy kod obsługi błędów następuje po wywołaniu funkcji.
Prawidłowy kod operacji jest wcięty o jeden poziom. Jeśli mamy inną funkcję do wywołania, musimy wciskać jeszcze raz.
zc jednym zazwyczaj mógł napisać coś takiego:
Bar *fooResult = foo();
if (fooResult == null) {
// handle error and return
}
// continue correct operations here
Znalazłem dwa sposoby, aby osiągnąć podobny styl kodu ze Swifta, ale mi się nie podoba albo.
let fooResultOpt = foo()
if fooResult == nil {
// handle error and return
}
// use fooResultOpt! from here
let fooResult = fooResultOpt! // or define another variable
Jeśli napiszę "!" wszędzie, po prostu wygląda źle dla mojego gustu. Mogę wprowadzić inną zmienną, ale to też nie wygląda dobrze. Idealnie chciałabym zobaczyć:
if !let fooResult = foo() {
// handle error and return
}
// fooResult has Bar type and can be used in the top level
Czy brakuje czegoś w opisie lub jest jakiś inny sposób, aby napisać dobrą patrząc kod SWIFT?
Dzięki, ale rozwiązanie nie różni się od składni if (niech wartość = x) {. ..} else {...} i mam wszystkie wady, o których wspomniałem w pytaniu. – vbezhenar