1

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

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

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

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

提前谢谢了

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

func formatLineText(singleLineText: String) -> Text {
    
    let stringArray = singleLineText.components(separatedBy: .whitespaces)
    let stringToTextView = stringArray.reduce(Text(""), {
        if !wordIsValid(word: $1) {
            return $0 + Text($1).foregroundColor(Color.red).underline() + Text(" ")
        }
        else {
            return $0 + Text($1) + 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
}
4

1 回答 1

1

您可以.enumerated在 your中使用reduce来检查该项目是否是最后一个 - 如果是,请不要返回\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

于 2022-02-16T16:38:46.957 回答