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
相关产品推荐
相关产品推荐

