Semua contoh berikut digunakan
var str = "Hello, playground"
startIndex
dan endIndex
startIndex
adalah indeks dari karakter pertama
endIndex
adalah indeks setelah karakter terakhir.
Contoh
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Dengan rentang satu sisi Swift 4 , rentang dapat disederhanakan ke salah satu bentuk berikut.
let range = str.startIndex...
let range = ..<str.endIndex
Saya akan menggunakan formulir lengkap dalam contoh berikut untuk kejelasan, tapi demi keterbacaan, Anda mungkin ingin menggunakan rentang satu sisi dalam kode Anda.
after
Seperti dalam: index(after: String.Index)
after
mengacu pada indeks karakter langsung setelah indeks yang diberikan.
Contoh
// 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
Seperti dalam: index(before: String.Index)
before
mengacu pada indeks karakter tepat sebelum indeks yang diberikan.
Contoh
// 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
Seperti dalam: index(String.Index, offsetBy: String.IndexDistance)
- The
offsetBy
value bisa positif atau negatif dan dimulai dari indeks yang diberikan. Meskipun dari jenisnya String.IndexDistance
, Anda dapat memberikannya Int
.
Contoh
// 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
Seperti dalam: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- Ini
limitedBy
berguna untuk memastikan bahwa offset tidak menyebabkan indeks keluar batas. Ini adalah indeks pembatas. Karena ada kemungkinan offset melebihi batas, metode ini mengembalikan Opsional. Ia kembali nil
jika indeks di luar batas.
Contoh
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Jika offsetnya 77
bukan 7
, maka if
pernyataan itu akan dilewati.
Mengapa String.Index dibutuhkan?
Akan lebih mudah menggunakan Int
indeks untuk String. Alasan Anda harus membuat yang baru String.Index
untuk setiap String adalah karena Karakter di Swift tidak memiliki panjang yang sama di bawah tenda. Satu Karakter Swift mungkin terdiri dari satu, dua, atau bahkan lebih titik kode Unicode. Jadi, setiap String unik harus menghitung indeks Karakternya.
Mungkin untuk menyembunyikan kerumitan ini di balik ekstensi indeks Int, tetapi saya enggan melakukannya. Senang rasanya diingatkan tentang apa yang sebenarnya terjadi.
startIndex
lebih dari 0?é
. Ini sebenarnya terbuat darie
plus\u{301}
representasi Unicode. Jika Anda menggunakan indeks nol, Anda akan mendapatkan karaktere
atau aksen ("kuburan"), bukan seluruh kluster yang membentuké
. MenggunakanstartIndex
memastikan Anda akan mendapatkan seluruh cluster grafem untuk karakter apa pun.String.Index
dari integer, selain membangun dummy string dan menggunakan.index
metode di atasnya? Saya tidak tahu apakah saya melewatkan sesuatu, tetapi dokumen tidak mengatakan apa-apa.String.Index
dengan integer karena setiap SwiftCharacter
tidak harus sama dengan yang Anda maksud dengan integer. Meskipun demikian, Anda dapat meneruskan integer keoffsetBy
parameter untuk membuat fileString.Index
. Jika Anda tidak memiliki aString
, maka Anda tidak dapat membuat aString.Index
(karena Swift hanya dapat menghitung indeks jika mengetahui karakter sebelumnya dalam string tersebut). Jika Anda mengubah string, maka Anda harus menghitung ulang indeks. Anda tidak dapat menggunakan yang samaString.Index
pada dua string yang berbeda.sumber
Buat UITextView di dalam tableViewController. Saya menggunakan fungsi: textViewDidChange dan kemudian memeriksa kembali-key-input. kemudian jika terdeteksi input tombol kembali, hapus input tombol kembali dan tutup keyboard.
sumber