
Wszystkie poniższe przykłady używają
var str = "Hello, playground"
startIndex i endIndex
startIndex jest indeksem pierwszego znaku
endIndexjest 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)
offsetByWartość 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)
limitedByJest 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, niljeś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ł 77zamiast 7, to ifinstrukcja zostałaby pominięta.
Dlaczego potrzebny jest String.Index?
Byłoby znacznie łatwiej używać Intindeksu dla pszczół. Powodem, dla którego musisz utworzyć nowy String.Indexdla 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.
startIndexbyć cokolwiek innego niż 0?