Swift中如何生成随机数量的类实例以构建随机训练计划
Hey,我来帮你搞定这个随机训练计划的需求,咱们一步步来实现:
首先得有个类来封装每个训练动作的核心信息,比如名称和次数:
class WorkoutExercise { let name: String let reps: Int init(name: String, reps: Int) { self.name = name self.reps = reps } }
这个类足够简洁,刚好满足存储动作信息的需求,后续如果要加更多属性(比如动作类型、休息时长)也能轻松扩展。
接下来写个方法生成随机的训练动作数组。咱们先定好可选的动作名称数组,然后随机生成动作的数量(比如2到6个,你可以自己调整范围),再给每个动作分配随机次数:
func generateRandomWorkout() -> [WorkoutExercise] { // 指定可选的训练动作名称数组 let availableExercises = ["俯卧撑", "500米划船", "深蹲", "平板支撑", "引体向上"] // 随机生成训练动作的数量(这里设置2到6个,可按需调整) let exerciseCount = Int.random(in: 2...6) var workoutPlan = [WorkoutExercise]() for _ in 0..<exerciseCount { // 随机选一个动作名称 guard let randomName = availableExercises.randomElement() else { continue } // 临时随机次数,后续你可以根据动作类型设置专属上下限 let randomReps = Int.random(in: 1...10) let exercise = WorkoutExercise(name: randomName, reps: randomReps) workoutPlan.append(exercise) } return workoutPlan }
这里给你提个后续优化的思路:按动作类型设置次数上下限,可以做一个字典来映射动作和对应的次数范围,比如:
let exerciseRepRanges: [String: ClosedRange<Int>] = [ "俯卧撑": 5...10, "500米划船": 1...1, "深蹲": 8...15, "平板支撑": 30...60 // 如果是计时类动作,你可以把reps改成Double或者单独加duration属性哦 ]
然后生成次数的时候,就根据动作名称取对应的范围:
let repsRange = exerciseRepRanges[randomName] ?? 1...10 // 兜底的默认范围 let randomReps = Int.random(in: repsRange)
假设你有一个生成计划的ViewController(比如WorkoutGeneratorVC),和一个展示计划的WorkoutDisplayVC,咱们在WorkoutGeneratorVC里生成好计划后,通过segue把数据传过去:
首先在WorkoutDisplayVC里定义一个接收数据的属性:
class WorkoutDisplayVC: UIViewController { var workoutPlan: [WorkoutExercise]! // 后续tableView相关代码... }
然后在WorkoutGeneratorVC的prepare(for:sender:)方法里传递数据:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "ShowWorkoutPlanSegue" { guard let destinationVC = segue.destination as? WorkoutDisplayVC else { return } // 调用之前写的方法生成训练计划 let generatedWorkout = generateRandomWorkout() destinationVC.workoutPlan = generatedWorkout } }
最后在WorkoutDisplayVC里配置TableView,展示训练计划:
先把TableView的数据源和代理设置好(可以在storyboard里拖线,或者代码里手动设置),然后实现数据源方法:
extension WorkoutDisplayVC: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return workoutPlan.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "WorkoutCell", for: indexPath) let exercise = workoutPlan[indexPath.row] cell.textLabel?.text = exercise.name // 可以根据动作类型调整文案,比如划船显示"1 组",平板支撑显示"\(exercise.reps) 秒" cell.detailTextLabel?.text = "\(exercise.reps) 次" return cell } }
记得在storyboard里给TableViewCell设置好identifier(比如"WorkoutCell"),或者用代码注册cell哦。
这样一套流程下来,就能实现你要的随机训练计划生成、数据传递和TableView展示啦,后续你可以根据需求再调整细节,比如动作类型的区分、UI样式优化之类的。
内容的提问来源于stack exchange,提问作者nc14

