SwiftUI翻译App中特定连续字符组合合并逻辑实现求助
SwiftUI翻译App中特定连续字符组合合并逻辑实现求助
看起来你已经把基础框架搭得差不多了,现在卡在识别并合并特定双字符组合这一步对吧?我完全理解你的需求——就是要把输入里的"CH""OO"这类连续字符合并成单个元素,这样就能对应显示单个符号图片了。
其实核心思路就是遍历字符数组时,主动检查当前字符和下一个字符是否属于目标组合,是的话就合并,同时跳过下一个字符避免重复处理。我给你写个具体的实现方案,你可以直接拿去用:
首先,我们先定义需要合并的所有双字符组合,用Set来存储的话查找效率会更高:
let combinedPairs: Set<String> = ["CH", "AE", "EO", "KH", "NG", "OO", "SH", "TH"]
然后写一个处理数组的函数,用while循环来灵活控制索引:
func processCombinedCharacters(from inputArray: [String]) -> [String] { var result: [String] = [] var index = 0 while index < inputArray.count { // 检查是否存在下一个字符,且当前+下一个是目标组合 if index + 1 < inputArray.count { let currentPair = inputArray[index] + inputArray[index + 1] if combinedPairs.contains(currentPair) { result.append(currentPair) index += 2 // 跳过下一个字符,因为已经合并处理了 continue } } // 不是组合的话,直接添加当前字符 result.append(inputArray[index]) index += 1 } return result }
为了避免数组越界的风险,你还可以给Collection加个安全下标的扩展(可选,但很实用):
extension Collection { subscript(safe index: Index) -> Element? { return indices.contains(index) ? self[index] : nil } }
接下来,把你原来的字符数组转换和组合合并逻辑结合起来,写个统一的函数:
func getTranslatableSymbols(from input: String) -> [String] { // 先把输入字符串拆成单个字符的数组 let singleChars = input.map { String($0) } // 再处理合并组合 return processCombinedCharacters(from: singleChars) }
最后在你的View里替换原来的调用就行:
WrappingHStack(alignment: .leading, spacing: .dynamic(minSpacing: 15)) { WrappingHStack(getTranslatableSymbols(from: toBeTranslated), id: \.self) { character in Image(character) .resizable() .scaledToFit() .frame(width: 30, height: 30) } }
测试一下你举的例子:输入"SMOOTH CHARACTER"拆成数组后,经过这个函数处理,正好会变成你想要的["S", "M", "OO", "TH", " ", "CH", "A", "R", "A", "C", "T", "E", "R"],完美匹配需求~
另外给你提个小建议:如果用户输入可能有大小写混合的情况(比如输入"ch"而不是"CH"),可以在拆分成字符数组前统一转成大写或小写,比如input.uppercased().map { String($0) },这样就能确保组合匹配不会出错啦。
备注:内容来源于stack exchange,提问作者Bobby Coleman
相关产品推荐
相关产品推荐

