Wszystkie poniższe przykłady używają
var str = "Hello, playground"
startIndex
i endIndex
startIndex
jest indeksem pierwszego znaku
endIndex
jest indeksem po ostatnim znaku.
Przykład
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Dzięki jednostronnym seriom Swift 4 , asortyment można uprościć do jednej z następujących form.
let range = str.startIndex...
let range = ..<str.endIndex
W celu zachowania przejrzystości użyję pełnej formy w poniższych przykładach, ale ze względu na czytelność prawdopodobnie zechcesz użyć jednostronnych zakresów w swoim kodzie.
after
Jak w: index(after: String.Index)
after
odnosi się do indeksu znaku bezpośrednio po danym indeksie.
Przykłady
// character
let index = str.index(after: str.startIndex)
str[index] // "e"
// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range] // "ello, playground"
before
Jak w: index(before: String.Index)
before
odnosi się do indeksu znaku bezpośrednio przed danym indeksem.
Przykłady
// character
let index = str.index(before: str.endIndex)
str[index] // d
// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range] // Hello, playgroun
offsetBy
Jak w: index(String.Index, offsetBy: String.IndexDistance)
offsetBy
Wartość może być dodatnia lub ujemna, a rozpoczyna się od danego indeksu. Chociaż jest tego typu String.IndexDistance
, możesz nadać mu plik Int
.
Przykłady
// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p
// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
str[range] // play
limitedBy
Jak w: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
limitedBy
Jest przydatny do upewniając się, że nie powoduje przesunięcia indeksu, aby przejść poza granicami. Jest to indeks ograniczający. Ponieważ przesunięcie może przekroczyć limit, ta metoda zwraca parametr Optional. Zwraca, nil
jeśli indeks jest poza zakresem.
Przykład
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Gdyby offset był 77
zamiast 7
, to if
instrukcja zostałaby pominięta.
Dlaczego potrzebny jest String.Index?
Byłoby znacznie łatwiej używać Int
indeksu dla pszczół. Powodem, dla którego musisz utworzyć nowy String.Index
dla każdego łańcucha, jest to, że postacie w języku Swift nie mają takiej samej długości pod maską. Pojedynczy znak Swift może składać się z jednego, dwóch lub nawet więcej punktów kodowych Unicode. Dlatego każdy unikalny ciąg musi obliczyć indeksy swoich znaków.
Jest to możliwe, aby ukryć tę złożoność za rozszerzeniem indeksu Int, ale niechętnie to robię. Warto przypomnieć sobie, co się naprawdę dzieje.
startIndex
być cokolwiek innego niż 0?