因为表情符号,“无法增加endIndex”

时间:2016-08-05 00:21:33

标签: ios uitextview

我有一个函数可以找到用户在UITextView中选择的当前单词。但是,如果我在UITextView.text属性中使用表情符号时调用此函数,我会看到崩溃。我相信这是因为String vs NSString中的字符数不同。

如何正确转换?

func currentWord() -> String {

    let cursorPosition = selectedRange.location
    let separationCharacters = NSCharacterSet(charactersInString: " ")

    // crash occurs here
    let beginRange = Range(text.startIndex.advancedBy(0) ..< text.startIndex.advancedBy(cursorPosition))
    let endRange = Range(text.startIndex.advancedBy(cursorPosition) ..< text.startIndex.advancedBy(text.characters.count))

    let beginPhrase = text.substringWithRange(beginRange)
    let endPhrase = text.substringWithRange(endRange)

    let beginWords = beginPhrase.componentsSeparatedByCharactersInSet(separationCharacters)
    let endWords = endPhrase.componentsSeparatedByCharactersInSet(separationCharacters)

    return beginWords.last! + endWords.first!
}

1 个答案:

答案 0 :(得分:1)

  

我认为这是因为String vs NSString

中的字符数不同

你是对的。你在使用NSRange(Cocoa)和Range(Swift)之间来回切换 - 它们的工作方式不同。 NSString(Cocoa)和String(Swift)对字符边界的位置有不同的看法。你需要保持一致。

在第一行中使用selectedRange后,您就进入了NSRange的Cocoa世界。你需要始终坚持可可世界。不要使用任何Swift Ranges!不要使用任何Swift characters

完全使用NSRange构建beginRange - 例如,请致电NSMakeRange。不要使用characters.count;留在NSString世界并使用字符串length(在Swift中,即utf16.count)。一切都会好的。