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

Swift如何实现句子单词反转且保持数字、数值片段不被反转

问题原因

你现有代码的问题在于直接对所有按词枚举的片段做全量反转,没有区分字母、数字和符号字符,所以会出现数字位置颠倒、数字和字母混合的词整体反转不符合预期的问题。

调整方案

根据你的需求场景,可选择以下两种实现思路:

思路1:完全跳过数值类片段不反转

如果需求是只要片段包含数字、数值类符号,就整体保留原内容不做反转,可直接在反转前加数字存在判断:

func reverseWordsInSentence(sentence: String) -> String {
    var sentence = sentence
    sentence.enumerateSubstrings(in: sentence.startIndex..., options: .byWords) { substring, range, _, _ in
        guard let substring = substring,
              // 子串不包含任何数字才执行反转
              substring.rangeOfCharacter(from: .decimalDigits) == nil else {
            return
        }
        sentence.replaceSubrange(range, with: substring.reversed())
    }
    return sentence
}

适用场景:纯单词和纯数值片段完全分离的场景,数值类内容整体不需要做任何修改。

思路2:仅反转片段内的字母字符,数字/符号位置保持不变

如果需求是数字、符号保留在原位置,仅反转同一片段内的字母部分(和你给出的示例预期完全匹配),可先实现字母单独反转的辅助方法,再替换原有逻辑:

// 辅助方法:仅反转字符串内的字母,其他字符位置不变
func reverseOnlyLetters(in string: String) -> String {
    var charArray = Array(string)
    // 收集所有字母并反转
    let allLetters = charArray.filter(\.isLetter)
    var reversedLetterIterator = allLetters.reversed().makeIterator()
    // 遍历替换原位置的字母
    for index in charArray.indices where charArray[index].isLetter {
        charArray[index] = reversedLetterIterator.next()!
    }
    return String(charArray)
}

func reverseWordsInSentence(sentence: String) -> String {
    var sentence = sentence
    sentence.enumerateSubstrings(in: sentence.startIndex..., options: .byWords) { substring, range, _, _ in
        guard let substring = substring else { return }
        sentence.replaceSubrange(range, with: reverseOnlyLetters(in: substring))
    }
    return sentence
}

测试验证:输入Test1, I like to learn Swift 24/7,输出结果为tseT1, I ekil ot nrael tfiwS 24/7,完全符合你的预期。


内容的提问来源于stack exchange,提问作者Serhii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:45:05