2016-08-05 19 views
1

Ich habe eine Funktion, die das aktuelle Wort findet, das ein Benutzer in einem UITextView ausgewählt hat. Wenn ich diese Funktion jedoch aufruft, wenn sich ein Emoji in der Eigenschaft UITextView.text befindet, sehe ich einen Absturz. Ich glaube, das liegt an den unterschiedlichen Zeichenzahlen in String vs NSString."EndIndex kann nicht inkrementiert werden" wegen Emoji

Wie kann ich das richtig konvertieren?

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! 
} 

Antwort

1

Ich glaube, dies wegen der unterschiedlichen Charakter zählt in String vs NSString

Du hast Recht darüber ist. Sie wechseln zwischen NSRange (Cocoa) und Range (Swift) hin und her - und sie arbeiten anders. Und NSString (Cocoa) und String (Swift) haben unterschiedliche Vorstellungen davon, wo die Zeichengrenzen liegen. Sie müssen konsistent sein.

Sobald Sie selectedRange in der ersten Zeile verwendet haben, befinden Sie sich in der Cocoa-Welt von NSRange. Sie müssen konsequent in der Kakaowelt bleiben. Verwenden Sie keine Swift Ranges! Verwenden Sie keine Swift characters!

Bilden Sie Ihre beginRange vollständig mit NSRange - zum Beispiel Anruf NSMakeRange. Verwenden Sie nicht characters.count; Bleiben Sie in der NSString-Welt und verwenden Sie die Zeichenfolge length (in Swift, das ist die utf16.count). Dann wird alles gut.

+0

Ich versuchte dies, aber jetzt sagt es der Bereich ist außerhalb der Grenzen, wenn ich "substringWithRange" -Methode aufrufen. Irgendwelche Gedanken? – cb428

+0

Nevermind, Mein Fehler war, dass der NSMakeRange (Start, Ende - Start) sein sollte. Ich hatte (Anfang, Ende). – cb428