Swift中结构体无可用初始化器报错问题求助
解决“无可用初始化器”错误及测试打印问题
嘿,刚上手开发第一个App就遇到初始化器问题很正常,咱们一步步拆解修复:
1. 先补全WorkoutExerciseGenerator的核心逻辑
你给出的generate方法不完整,先把它补成能正确返回WorkoutExercise实例的完整代码——比如咱们让它随机生成1到maxReps之间的训练次数,逻辑更合理:
struct WorkoutExercise { let name : String let reps : Int } struct WorkoutExerciseGenerator { let name: String let maxReps: Int func generate() -> WorkoutExercise { // 生成1到maxReps范围内的随机训练次数 let randomReps = Int.random(in: 1...maxReps) return WorkoutExercise(name: name, reps: randomReps) } }
2. 定位“无可用初始化器”的根源
这个错误大概率是初始化结构体时没匹配正确的参数:
WorkoutExercise的坑:因为它的name和reps都是let且没有默认值,Swift不会生成无参初始化器,你必须传入name和reps两个参数才能创建实例,不能直接写WorkoutExercise()。WorkoutExerciseGenerator的坑:同理,它的name和maxReps也是无默认值的let属性,必须用init(name:maxReps:)初始化,不能省略参数。
3. 能正常运行的测试打印代码示例
按照正确的初始化方式写测试代码,就能解决打印功能失效的问题:
// 初始化训练动作生成器 let pushUpGenerator = WorkoutExerciseGenerator(name: "俯卧撑", maxReps: 20) // 生成具体的训练动作 let pushUpWorkout = pushUpGenerator.generate() // 打印结果 print("生成的训练动作:\(pushUpWorkout.name),次数:\(pushUpWorkout.reps)")
额外小提示(避免后续踩坑)
如果你之后给结构体添加自定义初始化器,Swift会自动移除默认的成员初始化器。要是想同时保留两种初始化方式,把自定义初始化器写在extension里就行:
extension WorkoutExerciseGenerator { // 自定义初始化器:默认maxReps为15 init(name: String) { self.name = name self.maxReps = 15 } } // 现在两种初始化方式都能用 let sitUpGenerator1 = WorkoutExerciseGenerator(name: "仰卧起坐") let sitUpGenerator2 = WorkoutExerciseGenerator(name: "仰卧起坐", maxReps: 30)
这样调整后,你的测试打印功能就能正常运行啦~
内容的提问来源于stack exchange,提问作者nc14
相关产品推荐
相关产品推荐

