删除日文字符时,Swift“无法递增endIndex”

时间:2015-09-30 05:34:13

标签: ios xcode swift

我正在使用Swift 2.0 / Xcode 7.0作为iOS应用。我已经建立了一个日语IME来将罗马字符转换成日语等价物。例如:

  • 键入“a”会将“a”转换为“あ”
  • 键入“k”将不会执行任何操作(日语不匹配),直到输入下一个字符为止,例如键入“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是文本字段中的文字。

imeInputLengthint(初始值= 0),在找到匹配项后,会按文本字段中的总字符数递增。

JIMEDCJIME是处理从罗马字符到日文字符转换的键/值对。

我在代码运行之前将endIndex打印到控制台。它似乎按预期递增/递减,但上面的代码块失败并出现增量错误。

我几周来一直在反对这一点,但没有任何进展。

修改:澄清了对imeInputLength的处理,并添加了其他代码以便澄清。

1 个答案:

答案 0 :(得分:0)

与l'L'的一次对话使我走上正轨。我对错误消息can not increment endIndex感到困惑。实际上,我在我的范围内创建了一个越界错误。

按下退格键时,我没有修改imeInputLength以反映输入字符串的新长度。因此,我的advanceBy金额大于更新的endIndex金额。 Swift将其作为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:
    ...
}

如果按下退格键,我需要查看imeInputLength值是否大于输入字段的当前字符数。 imeInputLength结尾的唯一用例是使用退格键删除日文字符时。捕获此条件时,我将imeInputLength重置为当前字符数并退出例程。

我很高兴地说我的所有用例现在都测试出来了!