Swift结构体能否无值初始化?如何实现空构造?
Swift中空结构体的实现方案及你的问题解决办法
你写的空init(){}编译失败,核心原因是Swift要求结构体的所有存储属性必须在初始化流程结束前完成赋值,你的空构造器里没有给pergunta和resposta`赋值,所以无法通过编译。下面给你几种可行的解决方式:
最优方案:把popularQuiz改成静态方法
既然你调用这个方法不需要依赖实例的属性,完全没必要创建空实例,直接把方法改成**类型方法(静态方法)**即可,这样不用初始化结构体就能调用:
struct Quiz { var pergunta: String var resposta: Bool init(pergunta: String, resposta: Bool) { self.pergunta = pergunta self.resposta = resposta } // 用static修饰,变成类型方法 static func popularQuiz() -> [Quiz] { // 这里写你的逻辑,比如返回多个Quiz实例 return [ Quiz(pergunta: "Pergunta 1", resposta: true), Quiz(pergunta: "Pergunta 2", resposta: false) ] } } // 直接通过类型名调用方法 let quizzes = Quiz.popularQuiz()
如果一定要保留实例方法(不推荐)
如果你坚持要通过空实例调用这个方法,有两种实现方式:
方式1:给存储属性设置默认值
给pergunta和resposta加上默认值,这样空构造器可以正常工作(甚至Swift会自动生成空构造器,不用手动写):
struct Quiz { // 给属性添加默认值 var pergunta: String = "" var resposta: Bool = false init(pergunta: String, resposta: Bool) { self.pergunta = pergunta self.resposta = resposta } // 空构造器可以省略,Swift会自动生成,手动写也没问题 init() {} func popularQuiz() -> [Quiz] { // 你的实现逻辑 ... } } // 创建空实例并调用方法 let emptyQuiz = Quiz() let quizzes = emptyQuiz.popularQuiz()
方式2:在空构造器里显式赋值
如果不想给属性加默认值,就在空构造器里直接给两个属性赋值初始值:
struct Quiz { var pergunta: String var resposta: Bool init(pergunta: String, resposta: Bool) { self.pergunta = pergunta self.resposta = resposta } init() { // 显式给两个属性赋值 self.pergunta = "" self.resposta = false } func popularQuiz() -> [Quiz] { // 你的实现逻辑 ... } }
总结
优先选择静态方法的方案,因为popularQuiz是生成Quiz实例的工厂逻辑,属于类型本身的功能,和单个实例的状态无关,这样代码结构更清晰合理。
内容的提问来源于stack exchange,提问作者user10224736
相关产品推荐
相关产品推荐

