Я использую Swift 2.0/Xcode 7.0 для приложения iOS. Я построил японский IME для преобразования римских персонажей в их японский эквивалент. Например:Swift «не может увеличивать endIndex» при удалении японских символов
- Typing «а» преобразует «а» до «あ»
- Ввод «к» не будет делать ничего (не матч на японском языке) до следующего символа набирается, например, набрав a «k», то «a» приведет к «か»
Моя проблема в том, что я пытаюсь удалить японский символ. Если в текстовом поле есть только один символ, клавиша/функция удаления работает так, как ожидалось. Однако, если есть несколько, когда я пытаюсь удалить символ, я получаю ошибку can not increment endIndex
в следующем коде.
var imeInputLength: Int = 0
let currentInputValue: String = txtfldYourResponse.text!.lowercaseString
if(currentInputValue.characters.count==0) {
imeInputLength = 0
}
let inputStringToKeep: String = currentInputValue.substringWithRange(
Range<String.Index>(start: currentInputValue.startIndex.advancedBy(imeInputLength),
end: currentInputValue.endIndex))
let imeStringToKeep: String = currentInputValue.substringWithRange(
Range<String.Index>(start: currentInputValue.startIndex,
end: currentInputValue.startIndex.advancedBy(imeInputLength)))
if let imeValueDC = JIMEDC[inputStringToKeep] {
txtfldYourResponse.text = imeStringToKeep + imeValueDC
imeInputLength = (txtfldYourResponse.text?.characters.count)!-1
}
if let imeValue = JIME[inputStringToKeep] {
txtfldYourResponse.text = imeStringToKeep + imeValue
imeInputLength = txtfldYourResponse.text!.characters.count
}
currentInputValue
- текст с текстового поля.
imeInputLength
- int
(начальное значение = 0), которое увеличивается по счету общего символа в текстовом поле ПОСЛЕ соответствия.
JIMEDC
и JIME
являются парами ключ/значение, которые обрабатывают преобразование с римских на японские символы.
Я печатаю endIndex
на консоли перед запуском кода. Кажется, что он увеличивается/уменьшаться, как ожидалось, но вышеописанный блок кода не работает с ошибкой приращения.
Я уже стучал головой об этом пару недель без каких-либо успехов.
Редактировать: Уточненная обработка imeInputLength
и добавлен дополнительный код для пояснения.
Почему вы каждый раз возвращаете значение 'imeInputLength' в ноль? –
'imeInputLength' отслеживает, сколько римских символов было напечатано, чтобы иметь возможность искать японский символ из другого объекта.Значение увеличивается на 1 каждый раз, когда совпадение не найдено. Когда найден соответствующий японский символ, 'imeInputLength' сбрасывается на 0, чтобы начать поиск следующего набора символов Roman. – Robert
Проблема в том, что - каждый раз, когда вы ее перезагружаете, вы делаете 'advancedBy' =' 0', поэтому 'endIndex' не может увеличиваться. –