You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:44:50