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
时都不会重新创建的位置
我正在尝试创建一个函数,其中对多行字符串进行拼写检查并返回单个 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