2015-09-30 4 views
1

Я использую 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 и добавлен дополнительный код для пояснения.

+0

Почему вы каждый раз возвращаете значение 'imeInputLength' в ноль? –

+0

'imeInputLength' отслеживает, сколько римских символов было напечатано, чтобы иметь возможность искать японский символ из другого объекта.Значение увеличивается на 1 каждый раз, когда совпадение не найдено. Когда найден соответствующий японский символ, 'imeInputLength' сбрасывается на 0, чтобы начать поиск следующего набора символов Roman. – Robert

+0

Проблема в том, что - каждый раз, когда вы ее перезагружаете, вы делаете 'advancedBy' =' 0', поэтому 'endIndex' не может увеличиваться. –

ответ

0

Боковой разговор с l'L'l привел меня на правильный путь. Меня смутило сообщение об ошибке can not increment endIndex. В действительности, я создавал ошибку вне диапазона в моем диапазоне.

При нажатии клавиши backspace я не изменял imeInputLength, чтобы отразить новую длину входной строки. В результате моя сумма advanceBy была больше, чем обновленное значение endIndex. Свифт бросил это как can not increment endIndex, но причина этого была startIndex была теперь больше, чем endIndex.

Я решил это, первую проверку на следующее:

if(imeInputLength > currentInputValue.characters.count) { 
    print("You must have pressed backspace") 
    imeInputLength = txtfldYourResponse.text!.characters.count 
} else { 
    let inputStringToKeep: 
    ... 
} 

Если клавиша Backspace нажата, мне нужно, чтобы увидеть, если значение imeInputLength было больше, чем текущее количество символов в поле ввода. Единственный случай использования, когда imeInputLength заканчивается больше, - это когда японский символ удаляется с помощью клавиши backspace. Когда это условие поймано, я возвращаю imeInputLength на текущий счетчик символов и выхожу из процедуры.

Я рад сказать, что все мои варианты использования теперь проверяют положительные результаты!

Смежные вопросы