2016-08-05 1 views
1

У меня есть функция, которая находит текущее слово, которое пользователь выбрал в UITextView. Однако, если я вызываю эту функцию, когда emoji находится в свойстве UITextView.text, я вижу крах. Я считаю, что это связано с разными значениями символов в String vs NSString.«Can not Increment endIndex» из-за emoji

Как правильно преобразовать это?

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

Я считаю, что это происходит из-за различные подсчеты символов в строках против NSString

Вы правы об этом. Вы переключаетесь вперед и назад между использованием NSRange (Cocoa) и Range (Swift) - и они работают по-разному. И NSString (Cocoa) и String (Swift) имеют разные представления о границах символов. Вы должны быть последовательными.

После того, как вы использовали selectedRange в первой строке, вы находитесь в мире какао NSRange. Вам нужно постоянно оставаться в мире какао. Не используйте Swift Ranges! Не используйте Swift characters!

Форма вашего beginRange полностью использует NSRange - например, звоните NSMakeRange. Не использовать characters.count; оставайтесь в мире NSString и используйте строку length (в Swift, то есть ее utf16.count). Тогда все будет хорошо.

+0

Я пробовал это, но теперь он говорит, что диапазон выходит за пределы, когда я называю метод substringWithRange. Есть предположения? – cb428

+0

Nevermind, Моя ошибка заключалась в том, что NSMakeRange должен быть (начало, конец - начало). У меня было (начало, конец). – cb428