2016-08-05 7 views
1

私は、ユーザーがUITextViewで選択した現在の単語を見つける関数を持っています。しかし、この関数を絵文字がUITextView.textプロパティにあるときに呼び出すと、クラッシュが発生します。これは、文字列とNSStringの文字数が異なるためです。絵文字のために "endIndexをインクリメントできません"

これを正しく変換するにはどうすればよいですか?

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のCocoaの世界に入ります。あなたは一貫してココアの世界にとどまる必要があります。スイフトレンジは使用しないでください!スイフトcharactersを使用しないでください!

beginRangeは完全にNSRangeを使用します(例:NSMakeRange)。 characters.countを使用しないでください。 NSStringの世界に滞在し、文字列のlength(Swiftで、そのutf16.count)を使用します。それですべてがうまくいく。

+0

私はこれを試しましたが、今度は "substringWithRange"メソッドを呼び出すと範囲が範囲外であると言います。何かご意見は? – cb428

+0

Nevermind、私のエラーは、NSMakeRangeが(start、end - start)でなければならないということでした。私は(開始、終了)していた。 – cb428

関連する問題