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?é
. W rzeczywistości składa się ze
plusa\u{301}
reprezentacji Unicode. Jeśli użyjesz indeksu zerowego, otrzymasze
znak lub znak akcentu („poważny”), a nie cały klaster, który tworzyé
. Użycie tegostartIndex
gwarantuje, że otrzymasz cały klaster grafemów dla dowolnej postaci.String.Index
z liczby całkowitej, inaczej niż zbudowanie fikcyjnego ciągu i użycie na nim.index
metody? Nie wiem, czy czegoś mi brakuje, ale doktorzy nic nie mówią.String.Index
z liczbą całkowitą, ponieważ każdy SwiftCharacter
niekoniecznie oznacza to samo, co masz na myśli z liczbą całkowitą. To powiedziawszy, możesz przekazać liczbę całkowitą dooffsetBy
parametru, aby utworzyć plikString.Index
. Jeśli jednak nie masz aString
, nie możesz skonstruować aString.Index
(ponieważ Swift może obliczyć indeks tylko wtedy, gdy wie, jakie są poprzednie znaki w ciągu). Jeśli zmienisz ciąg, musisz ponownie obliczyć indeks. Nie możesz użyć tego samegoString.Index
na dwóch różnych strunach.źródło
Utwórz UITextView wewnątrz tableViewController. Użyłem funkcji: textViewDidChange, a następnie sprawdziłem, czy dane wejściowe są zwracane. następnie jeśli wykryje wejście klawisza powrotu, usuń wejście klawisza powrotu i zamknij klawiaturę.
źródło