基于4字符字符串的未来日期校验代码优化咨询
4字符日期串的离线校验代码优化方案
优化方向
1. 简化字符串校验逻辑
原代码嵌套多层if逐个字符判断,冗余且可读性差。直接通过检查字符串长度+全数字校验,一次性完成合法性验证,避免不必要的索引判断。
2. 扁平化代码结构
用guard语句提前退出非法分支,替代嵌套if,让代码逻辑更清晰,减少嵌套层级。
3. 优化日期转换流程
将日期转换与天数计算的逻辑拆分,避免在嵌套中堆积代码,同时处理转换失败的边界情况。
4. 增强容错性
主动处理字符串长度不足4位、非数字字符、Epoch时间转换失败等场景,避免潜在崩溃。
优化后的代码
// 提取天数计算的工具方法(可放到Calendar扩展中复用) extension Calendar { func numberOfDaysBetween(_ from: Date, and to: Date) -> Int { let fromDate = startOfDay(for: from) let toDate = startOfDay(for: to) let components = dateComponents([.day], from: fromDate, to: toDate) return components.day ?? 0 } } // 主逻辑处理 if let reservationDate = node?.user?.dateValue { // 1. 校验字符串长度为4且全为数字 guard reservationDate.count == 4, reservationDate.allSatisfy({ $0.isNumber }) else { // 处理非法格式(比如含字母、长度不对) return } // 2. 拼接Epoch时间串并转换 let fullEpochString = "17" + reservationDate + "0000" guard let epochTime = TimeInterval(fullEpochString) else { // 处理时间转换失败的情况 return } // 3. 计算日期差并判断 let savedDate = Date(timeIntervalSince1970: epochTime) let now = Date() let calendar = Calendar.current let dayDifference = calendar.numberOfDaysBetween(savedDate, and: now) if dayDifference > 2 { // 执行超标后的操作 } }
补充说明
- 关于系统日期篡改的问题:当前方案保持离线优先,后续可通过服务器接口获取基准时间,替换
Date()进行二次校验; - 若未来4字符串包含字母,只需调整
allSatisfy的校验规则,比如自定义合法字符集即可; - 优化后的代码减少了大量冗余判断,执行效率更高,同时可读性和可维护性大幅提升。
内容的提问来源于stack exchange,提问作者nore982
相关产品推荐
相关产品推荐

