관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] UITextChecker 개념 (오타검사, 자동완성) 본문

iOS 응용 (swift)

[iOS - swift] UITextChecker 개념 (오타검사, 자동완성)

jake-kim 2023. 10. 9. 01:20

UITextChecker 개념

  • 교정기능을 제공하는 클래스
    • 오타 검사
    • 자동완성 및 제안 기능

https://developer.apple.com/documentation/uikit/uitextchecker

UITextChecker 오타 검사

  • 오타가 있는 mountein 문자열 준비 (mountain으로 잘 교정되는지 확인을 위함)
let str = "mountein"
  • UITextChecker 인스턴스 생성
let textChecker = UITextChecker()
  • rangeOfMisspelledWord(in:range:startingAt:wrap:language:) 메소드를 사용
    • language 값에는 언어코드가 들어가는데, 이 언어코드는 iSO 639-1가 사용

https://developer.apple.com/documentation/uikit/uitextchecker/1621029-rangeofmisspelledword

  • 이 언어코드는 Locale로 접근하여 획득도 가능
Locale.current.identifier // en_US
  • 이 메소드를 사용하여 오타가 난 지점의 range를 획득
let misspelledRange = textChecker.rangeOfMisspelledWord(
    in: str,
    range: NSRange(
        0..<str.utf16.count
    ),
    startingAt: 0,
    wrap: false,
    language: "en_US"
)
  • checker의 guesses(forWordRange:in:language:) 메소드를 사용하여 오타를 교정해준 단어들을 생성
guard
    misspelledRange.location != NSNotFound,
    let guesses = textChecker.guesses(
        forWordRange: misspelledRange,
        in: str,
        language: "en_US"
    )
else {
    print("Not found")
    return
}

print("guesss:", guesses) // ["mountain"]

UITextChecker 새로운 단어 학습시키기

  • 정적 메소드인 learnWord()를 사용하면 학습시키기가 가능

https://developer.apple.com/documentation/uikit/uitextchecker/1621028-learnword

UITextChecker.learnWord(str)
  • 이 다음 아래 메소드를 실행시키면 오타난 곳이 없는것으로 출력
    • learnWord는 UserDefault와 같이 디스크에 저장되고, 앱을 삭제하기 전까지는 앱을 다시 실행해도 계속 저장됨
let misspelledRange = textChecker.rangeOfMisspelledWord(
    in: str,
    range: NSRange(
        0..<str.utf16.count
    ),
    startingAt: 0,
    wrap: false,
    language: "en_US"
)

print(misspelledRange.location == NSNotFound) // true

UITextChecker 자동완성

  • checker의 completions(forPartialWordRange:in:language:)를 사용하면 자동완성된 문자열 추출이 가능
let partial = "mounta"
let completions = textChecker
    .completions(
        forPartialWordRange: NSRange(
            0..<partial.utf16.count
        ),
        in: partial,
        language: "en_US"
    )
print(completions)
/*
 Optional(["mountain", "mountains", "mountaineering", "mountaineer", "mountainside", "mountaintop", "mountainous", "mountain\'s", "mountainsides", "mountaintops", "mountable", "mountainboarding", "mountainside\'s", "mountainboarding\'s", "mountaintop\'s", "mountaineering\'s", "mountaineer\'s", "mountaineers"])
 */

* 전체 코드: https://github.com/JK0369/ExTextChecker

* 참고

https://developer.apple.com/documentation/uikit/uitextchecker/1621028-learnword

https://developer.apple.com/documentation/uikit/uitextchecker/1621029-rangeofmisspelledword

https://ko.wikipedia.org/wiki/ISO_639-1_%EC%BD%94%EB%93%9C_%EB%AA%A9%EB%A1%9D

https://nshipster.com/uitextchecker/

https://developer.apple.com/documentation/uikit/uitextchecker

 

Comments