Swift如何实现数组字符串中大于12的整数值按条件做常量减法
可落地实现方案
核心处理逻辑
- 规避原写法中固定拆分两段导致的越界风险,用通用的批量处理逻辑兼容任意数量、任意长度的区间格式
- 严格遵循转换规则:对字符串内解析出的所有整数,判断值是否大于12,满足条件则减去固定常量12,否则保留原值
- 转换完成后严格匹配原始字符串的分隔符结构(逗号分隔不同区间,横杠分隔单个区间的首尾值)拼接结果,保证格式和输入完全一致
完整可运行代码
// 固定扣除的常量值 let offset: Int = 12 /// 处理单条区间格式字符串的通用方法 /// - Parameter input: 形如 "x1-y1,x2-y2" 的原始区间字符串 /// - Returns: 完成数值转换后的同格式字符串 func processIntervalString(_ input: String) -> String { // 按逗号拆分所有独立区间段 let intervalGroups = input.components(separatedBy: ",") let processedGroups = intervalGroups.map { segment in // 拆分单个区间的首尾数值 let valueComponents = segment.components(separatedBy: "-") let processedValues = valueComponents.map { valueStr in guard let number = Int(valueStr) else { return valueStr } // 大于12的数值扣除固定常量,其余保留原值 return number > 12 ? String(number - offset) : String(number) } // 用横杠拼回单个区间的完整内容 return processedValues.joined(separator: "-") } // 用逗号拼回所有区间段的完整内容 return processedGroups.joined(separator: ",") } func test() { // 你原代码中的带竖线分隔的长字符串 let hours = "11-16,20-23|11-16,20-23|11-16,20-23|11-16,20-23|13-17,20-24|11-16,20-23|11-16,20-23" // 先拆分得到基础字符串数组 let originalArray = hours.components(separatedBy: "|") // 批量对数组元素做转换处理 let resultArray = originalArray.map { processIntervalString($0) } print(resultArray) // 实际输出验证: // ["11-4,8-11", "11-4,8-11", "11-4,8-11", "11-4,8-11", "1-5,8-12", "11-4,8-11", "11-4,8-11"] // 完全匹配你预期的转换规则 }
和原写法的优化点
- 原写法固定把每个元素拆成前后两段存入两个独立数组,一旦遇到逗号分隔的区间数量不是2个的场景,就会触发数组越界崩溃,上述通用处理逻辑不依赖固定的区间数量,任意结构的区间字符串都能正常兼容
- 原写法仅完成了字符串拆分,没有实现「字符串转整数-大小判断-数值计算-转回字符串」的核心转换流程,上述代码补全了完整的处理链路
- 原写法拆分后没有按原格式做字符串拼接,上述逻辑会严格匹配原输入的分隔符位置还原结果,不会出现格式错乱
内容的提问来源于stack exchange,提问作者Ben10
相关产品推荐
相关产品推荐

