SwiftUI - 拼写检查多行字符串

SwiftUI - Spell Checking Multi-line String

我正在尝试创建一个函数,其中对多行字符串进行拼写检查并返回单个 SwiftUI Text() 视图,其中任何拼写错误的单词都以红色突出显示。

通过按换行符拆分字符串,然后按空格拆分行,然后检查每个单词,我几乎破解了它。

我的主要问题是我在生成的文本视图末尾添加了一个额外的新行。无论如何我可以 trim 最后一个 Text("\n") 或者阻止它被添加到最后一行?

此外,是否有任何方法可以提高它的效率,因为在检查数组中的大量文本时引入了轻微的滞后,因此该函数被调用了很多次?

非常感谢

func formatText(multiLineText: String) -> Text {
    
    let lineArray = multiLineText.components(separatedBy: .newlines)
    let stringToTextView = lineArray.reduce(Text(""), {
        return [=10=] + formatLineText(singleLineText: ) + Text("\n")
    })
    return stringToTextView
}

func formatLineText(singleLineText: String) -> Text {
    
    let stringArray = singleLineText.components(separatedBy: .whitespaces)
    let stringToTextView = stringArray.reduce(Text(""), {
        if !wordIsValid(word: ) {
            return [=10=] + Text().foregroundColor(Color.red).underline() + Text(" ")
        }
        else {
            return [=10=] + Text() + Text(" ")
        }
    })
    return stringToTextView
}

func wordIsValid(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_GB")

    return misspelledRange.location == NSNotFound
}

您可以在 reduce 中使用 .enumerated 来检查该项目是否是最后一项 - 如果是,请不要 return \n.

func formatText(multiLineText: String) -> Text {
    let lineArray = multiLineText.components(separatedBy: .newlines)
    let stringToTextView = lineArray.enumerated().reduce(Text(""), { (acc,item) in
        return acc + formatLineText(singleLineText: item.1) + Text(item.0 != lineArray.endIndex - 1 ? "\n" : "")
    })
    return stringToTextView
}

就性能而言,我会将 let checker = UITextChecker() 移至每次调用 wordIsValid

时都不会重新创建的位置