SwiftUIでString型のスペルチェックを行う方法をざっくり説明


SwiftUIで開発をしているときに、

String型の変数に格納された文字列のスペルをチェックしたい。」
こんな時ってよくありますよね(いや、ない)。

そんな時はUIKitのUITextCheckerを使ってスペルチェックしちゃいましょう。

(備忘録的に自己満足で書いてるのであしからず)

UITextCheckerとは?

UITextChecker はUIKitで用意されているNSObjectを継承したクラスです。
インスタンスを作成して使います。

どんなコードを書いて使うの?

スペルチェックを行う関数を作りたい時は、

func spellCheck(word: String) -> Bool {
  let checker = UITextChecker()
  let range = NSRange(location: 0, length: word.utf16.count)
  let misspelledRange = checker.rangeOfMisspelledWord(
    in: word,
    range: range,
    startingAt: 0,
    wrap: false,
    language: "en") 

  return misspelledRange == NSNotFound
}

引数wordにスペルチェックしたいワードをString型で渡して、スペルが合っていたらtrueを返します。

いろいろ説明

NSRange

UITextCheckerを使うにはNSRangeという、まあ簡単に言うとスペルチェックをする範囲はどこですか?って質問に答えてあげる必要があります。その答えとしてNSRangeを引数として渡す必要があるわけです。

word.utf16.count

NSRangeを取得するには文字列の長さを渡してあげる必要がありますが、文字列がどの文字コード(utfとかjisとか)を使っているのかで長さが変わるので、utf16に変換して統一してから文字列wordの長さを渡してあげる必要があるわけです。

rangeOfMisspelledWord

実際にスペルチェックを行うのはこのメソッドです。
UITextCheckerのインスタンスメソッドであるこのメソッドを呼び出すことで、文字列の中の間違っている箇所を表したRangeを返します。もし文字列のスペルが合っていたらNSNotFoundが返されます。

最後に

SwiftUI学習の備忘録として書いています。
もし間違い等ありましたらご指摘お願いいたします。