我有一个函数可以找到用户在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!
}
答案 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
)。一切都会好的。