UITextChecker无法校验长度小于7字符单词拼写的问题咨询
问题原因
你拿到的{9223372036854775807, 0}就是NSNotFound的常量值,短词返回这个结果不代表单词合法,核心原因是UITextChecker的默认设计逻辑和你的使用场景不匹配:
- 这个类原生是为输入框实时拼写检查、自动更正场景设计的,为了避免把常用缩写、短俚语、极短拟声词误判为错误,系统默认会对长度低于阈值(不同iOS/macOS版本阈值在3~7字符区间浮动)的输入直接跳过拼写错误判定,返回
NSNotFound。 - 你传入的语言参数
"en"是通用英语标识,没有指定地区变体,部分系统版本下会加载不完整的词库规则,进一步放大短词检查失效的问题。
修正方法
按下面的逻辑调整代码,就能覆盖任意长度的单词校验:
- 把语言参数替换为带地区标识的完整代码,比如美式英语用
"en_US"、英式英语用"en_GB",确保系统加载完整的对应词库。 - 给短词补一层存在性校验:用系统的单词补全接口做二次判断——真实存在的单词作为输入时,补全接口一定会返回单词本身,这个逻辑不会触发短词跳过规则。
修正后的完整代码:
func isReal(word: String) -> Bool { let checker = UITextChecker() // 可根据业务需求切换为en_GB等其他英语地区变体 let targetLanguage = "en_US" let fullRange = NSRange(location: 0, length: word.utf16.count) // 先走原生拼写检查逻辑 let misspelledRange = checker.rangeOfMisspelledWord( in: word, range: fullRange, startingAt: 0, wrap: false, language: targetLanguage ) guard misspelledRange.location != NSNotFound else { // 原生检查未报错时,补做词库存在校验,覆盖短词跳过的场景 let completions = checker.completions( forPartialWordRange: fullRange, in: word, language: targetLanguage ) ?? [] // 如果需要兼容用户手动加入系统词典的词,可加上 || UITextChecker.learnedWords.contains(word) return completions.contains(word) } // 检测到明确拼写错误,直接返回false return false }
补充说明:如果你的业务需要过滤无意义超短词,可以在校验入口额外加词长判断,避免把"a"、"I"这类单个字符的合法英文单词误拦截。
内容的提问来源于stack exchange,提问作者Austen
相关产品推荐
相关产品推荐

