SwiftUI使用LazyVGrid时优雅生成重复时间整数数组的方法问询
优雅生成目标数组的两种实现方案
方案1:轻量批量生成(适配当前固定规则)
利用数组的flatMap批量生成重复元素,再补入特殊值后排序即可,完全替代硬编码:
// 定义需要重复2次的时间区间 let repeatTwiceRange = Array(10...12) + Array(14...18) // 每个元素重复2次后合并数组 let repeatedPart = repeatTwiceRange.flatMap { [$0, $0] } // 补入仅出现1次的9、13,排序后得到最终数组 let hoursList = ([9, 13] + repeatedPart).sorted()
生成结果和你硬编码的hoursList完全一致,后续调整时间范围只要修改对应区间参数即可。
方案2:封装生成方法(适配规则可变动的场景)
如果后续重复规则可能调整,可以把逻辑封装成独立方法,修改逻辑更方便:
func generateHourList() -> [Int] { var list = [Int]() for hour in 9...18 { // 自定义重复规则:9和13仅出现1次,其余时间出现2次 let repeatCount = (hour == 9 || hour == 13) ? 1 : 2 list.append(contentsOf: Array(repeating: hour, count: repeatCount)) } return list } // 调用直接生成目标数组 let hoursList = generateHourList()
额外注意点
你原代码中写的09本质是Int类型的9,如果需要展示为两位带前导零的格式,不需要修改数组存储逻辑,直接在Text中格式化输出即可:
Text("\(hours, format: .number.pad(toLength: 2, withPad: "0"))") // 输出效果为 09、10,和你预期的展示效果一致
另外你的ForEach直接遍历Int数组需要指定id,否则会编译报错,修改为:
ForEach(viewModel.hoursList, id: \.self) { hours in
内容的提问来源于stack exchange,提问作者kAiN
相关产品推荐
相关产品推荐

