A simple tutorial for find and identify the wrong typed words of the user in your application using the UITextChecker framework and the NatualLanguage framework.
Final result:
Let’s start!
We use for this tutorial the following new things:
In order to identify the wrong words in your phrase, you need to understand the language of the phrase.
NLLanguageRecognizer helps you to resolve this issue in a very simple way:
private func detectLanguage( phrase: String ) -> NLLanguage? { let recognizer = NLLanguageRecognizer() recognizer.processString(phrase) return recognizer.dominantLanguage }
You can pass a phrase on it and get the corresponding language.
let phrase = "This si a text wiht lots of errrors. The scope of this tutorila is to colorizze the wrong wordss." let phraseLanguage: NLLanguage? = detectLanguage( phrase: phrase ) print( phraseLanguage )
Now we need to check all the words and get, the wrong list words or the range of the words (use it for NSAttributedStrings for instance)
I’ve created a simple struct and a simple checker function, like these:
struct Words { var range: NSRange? var word: String }
And we use it in the checker:
private func checkMispelledWords( phrase: String ) -> [Words] { var rangesOfWords: [Words] = [Words]() let phraseLanguage: NLLanguage? = detectLanguage( phrase: phrase ) guard let language = phraseLanguage else { return rangesOfWords } let textChecker = UITextChecker() let nsString = NSString(string: phrase) let stringRange = NSRange(location: 0, length: nsString.length) var offset = 0 while true { let wordRange = textChecker.rangeOfMisspelledWord( in: phrase, range: stringRange, startingAt: offset, wrap: false, language: language.rawValue) guard wordRange.location != NSNotFound else { break } let wrongWord = nsString.substring(with: wordRange) offset = wordRange.upperBound rangesOfWords.append( Words(range: wordRange, word: wrongWord) ) } return rangesOfWords }
Now we have a new [Word] array with our data:
let words: [Words] = checkMispelledWords( phrase: textArea.attributedText.string)
If you add a button and a textarea in your app you can attach the attributed string and play with the attributes:
@IBAction func didCheckErrorsPressed(_ sender: Any) { let words: [Words] = checkMispelledWords(phrase: textArea.attributedText.string) words.forEach { print( "Word: ($0.word)" ) attributedString?.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: $0.range!) } textArea.attributedText = attributedString }
Now you can “coloryze” your text to make the errors in red.
Enjoy writing!
- Swift – Simple full screen loader - 11 August 2022
- macOS – Disable microphone while typing - 11 April 2022
- iOS – Secure app sensitive information - 25 March 2022