Во всех следующих примерах используется
var str = "Hello, playground"
startIndex
и endIndex
startIndex
это индекс первого символа
endIndex
это индекс после последнего символа.
пример
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
С помощью односторонних диапазонов Swift 4 диапазон можно упростить до одной из следующих форм.
let range = str.startIndex...
let range = ..<str.endIndex
Я буду использовать полную форму в следующих примерах для ясности, но для удобства чтения вы, вероятно, захотите использовать односторонние диапазоны в своем коде.
after
Как в: index(after: String.Index)
after
относится к индексу символа сразу после данного индекса.
Примеры
// 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
Как в: index(before: String.Index)
before
относится к индексу символа непосредственно перед данным индексом.
Примеры
// 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
Как в: index(String.Index, offsetBy: String.IndexDistance)
offsetBy
Значение может быть положительным или отрицательным , и начинается с заданного индекса. Хотя он и относится к типу String.IndexDistance
, вы можете присвоить ему Int
.
Примеры
// 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
Как в: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- Это
limitedBy
полезно для того, чтобы убедиться, что смещение не приводит к выходу индекса за пределы. Это ограничивающий индекс. Поскольку смещение может превышать предел, этот метод возвращает значение Optional. Он возвращается, nil
если индекс выходит за пределы.
пример
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Если бы смещение было 77
вместо 7
, то if
оператор был бы пропущен.
Зачем нужен String.Index?
Было бы намного проще использовать Int
индекс для строк. Причина, по которой вам нужно создавать новую String.Index
строку для каждой строки, заключается в том, что символы в Swift не имеют одинаковой длины под капотом. Один символ Swift может состоять из одной, двух или даже более кодовых точек Unicode. Таким образом, каждая уникальная строка должна вычислять индексы своих символов.
Возможно, эту сложность можно скрыть за расширением индекса Int, но я не хочу этого делать. Приятно напоминать о том, что происходит на самом деле.
startIndex
быть что-то еще, кроме 0?é
. На самом деле он состоит из представления Юникодаe
плюс\u{301}
. Если бы вы использовали нулевой индекс, вы бы получили либо знакe
ударения («серьезный»), а не весь кластер, составляющийé
. ИспользованиеstartIndex
гарантирует, что вы получите весь кластер графем для любого персонажа.String.Index
из целого числа, кроме создания фиктивной строки и использования на ней.index
метода? Не знаю, упустил ли я что-то, но в документации ничего не сказано.String.Index
с целым числом, потому что каждый SwiftCharacter
не обязательно равен тому же самому, что вы имеете в виду с целым числом. Тем не менее, вы можете передать целое число вoffsetBy
параметр для создания файлаString.Index
. Однако, если у вас нет aString
, вы не можете построить aString.Index
(потому что Swift может вычислить индекс только в том случае, если он знает, какие предыдущие символы в строке). Если вы измените строку, вам придется пересчитать индекс. Вы не можете использовать одно и то жеString.Index
на двух разных струнах.источник
Создайте UITextView внутри tableViewController. Я использовал функцию: textViewDidChange, а затем проверил ввод ключа возврата. затем, если он обнаружил ввод клавиши возврата, удалите ввод клавиши возврата и закройте клавиатуру.
источник