数组成员验证:优化XML提取的逗号分隔整数验证逻辑
嘿,我太懂这种“先默认没问题,再挨个排查推翻”的写法有多别扭了——确实不够简洁优雅!这里有几种更顺的思路,既能验证所有元素都是整数,又能直接拿到合规的数组,还能无缝和默认成功码数组合并:
1. 过滤+长度匹配法(最直观)
核心思路是:先把字符串拆成数组,然后用compactMap(其他语言里类似的方法比如JS的filter+Number.parseInt)提取出所有能转成整数的元素,最后对比原数组和有效数组的长度——如果长度一致,说明所有元素都是合规整数,直接用就行;不一致就说明有无效值。
举个Swift的例子:
let inputString = "123,456,789" let defaultSuccessCodes = [200, 201] // 拆分字符串 let splitParts = inputString.components(separatedBy: ",") // 提取所有有效整数 let validInts = splitParts.compactMap { Int($0) } // 验证:如果拆分后的元素数和有效整数数一致,说明全是合法整数 guard splitParts.count == validInts.count else { // 处理验证失败的情况,比如直接返回默认数组 print("输入包含非整数元素") let finalArray = defaultSuccessCodes return } // 验证通过,合并数组 let finalArray = validInts + defaultSuccessCodes
这种写法完全不需要flag变量,一步到位完成验证和转换,逻辑清晰到一眼就能看懂。
2. 全量判断+同步收集(紧凑高效)
用allSatisfy(或JS里的every)方法直接判断所有元素是否合规,同时在判断的过程中把有效整数收集起来,一举两得:
let inputString = "123,456,789" let defaultSuccessCodes = [200, 201] let splitParts = inputString.components(separatedBy: ",") var validInts: [Int] = [] // 遍历所有元素,同时验证并收集有效整数 let allElementsValid = splitParts.allSatisfy { part in if let num = Int(part) { validInts.append(num) return true } return false } if allElementsValid { let finalArray = validInts + defaultSuccessCodes // 后续业务逻辑 } else { // 处理无效输入 }
这种写法把验证和收集的逻辑揉进同一个遍历里,没有多余的步骤,代码非常紧凑。
3. 封装成工具函数(复用性拉满)
如果这种解析逻辑会在多处用到,直接把它封装成一个小函数,调用的时候简直不要太清爽:
func parseValidIntList(from string: String) -> [Int]? { let parts = string.components(separatedBy: ",") let validInts = parts.compactMap(Int.init) // 验证通过返回数组,否则返回nil return validInts.count == parts.count ? validInts : nil } // 调用示例 let inputString = "123,456,789" let defaultSuccessCodes = [200, 201] if let validInts = parseValidIntList(from: inputString) { let finalArray = validInts + defaultSuccessCodes // 业务处理 } else { // 无效输入处理 }
这样不仅代码更整洁,还能在多个地方复用这个解析逻辑,维护起来也方便。
总的来说,这些方法都避开了“先设true再循环改false”的反模式,要么通过结果对比验证,要么把验证和收集合并,代码可读性和优雅度都提升了不少,而且后续合并默认数组的步骤也完全不受影响~
内容的提问来源于stack exchange,提问作者Gordon
相关产品推荐
相关产品推荐

