Czy w języku Swift można sprawdzić, czy indeks istnieje w tablicy bez zgłaszania błędu krytycznego?
Miałem nadzieję, że uda mi się zrobić coś takiego:
let arr: [String] = ["foo", "bar"]
let str: String? = arr[1]
if let str2 = arr[2] as String? {
// this wouldn't run
println(str2)
} else {
// this would be run
}
Ale rozumiem
błąd krytyczny: indeks tablicy poza zakresem
index < array.count
?index >= 0 && index < array.count
Zamiast najgorszego przypadku n porównania.ArraySlice
, pierwszy indeks nie będzie wynosił 0, więcindex >= 0
nie będzie to wystarczająco dobre sprawdzenie..indices
zamiast tego działa w każdym przypadku.Rozszerzenie typu:
Używając tego, otrzymujesz opcjonalną wartość z powrotem podczas dodawania słowa kluczowego opcjonalne do swojego indeksu, co oznacza, że program nie ulega awarii, nawet jeśli indeks jest poza zakresem. W twoim przykładzie:
źródło
optional
parametru. Dzięki!Po prostu sprawdź, czy indeks jest mniejszy niż rozmiar tablicy:
źródło
Dodaj trochę cukru przedłużającego:
Zwiększa czytelność podczas
if let
kodowania stylów w połączeniu z tablicamiźródło
Możesz przepisać to w bezpieczniejszy sposób, aby sprawdzić rozmiar tablicy i użyć warunku trójskładnikowego:
źródło
if
instrukcji zamiast jednejif
instrukcji w oryginalnym kodzie. Mój kod zastępuje drugiif
operator warunkowy, umożliwiając zachowanie jednegoelse
zamiast wymuszania dwóch oddzielnychelse
bloków.if
pytanie z OP trafi do gałęzi „then” odpowiedzi Antonio, więc będą dwa zagnieżdżone pytaniaif
. Traktuję kod OP jako mały przykład, więc zakładam, że nadal chciałby miećif
. Zgadzam się z Tobą, że w jego przykładzieif
nie jest to konieczne. Ale z drugiej strony cała instrukcja jest bezcelowa, ponieważ OP wie, że tablica nie ma wystarczającej długości i żaden z jej elementów nie manil
, więc mógł usunąćif
i zachować tylko jejelse
blok.Rozszerzenie Swift 4:
Ja wolę metodę podobną.
Dzięki @Benno Kress
źródło
Potwierdzanie, czy istnieje indeks tablicy:
Ta metodologia jest świetna, jeśli nie chcesz dodawać cukru do przedłużania:
źródło
Obsługa indexOutOfBounds to praca dla mnie .
źródło