Swift继承初始化报错:'super.init'未在所有路径调用
解决Swift类继承中的初始化器错误
嘿,我来帮你搞定这个初始化的问题!你遇到的'super.init' isn't called on all paths before returning from initializer错误,根源出在类A的初始化逻辑里缺少了父类初始化方法的调用。
错误原因解析
Swift中,所有没有显式指定父类的自定义类,默认会继承NSObject。而NSObject的指定初始化器是init(),作为子类的类A,必须在完成自身属性的赋值后,调用父类的初始化方法,确保父类的部分也能被正确初始化。你的类A当前的初始化器只处理了自己的属性,没有调用super.init(),这就违反了Swift的初始化规则,导致了报错。
修正后的代码
我们只需要在类A的初始化器中添加super.init()调用即可,同时如果类B没有额外的属性或逻辑需要初始化,还可以简化代码:
class A { var objRunningJobs: UIViewController! var objCompletedJobs: UIViewController! init(objRunningJobs: UIViewController, objCompletedJobs: UIViewController) { self.objRunningJobs = objRunningJobs self.objCompletedJobs = objCompletedJobs // 添加父类初始化调用,完成父类部分的初始化 super.init() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } // 如果类B没有额外的初始化逻辑,可以省略override init,Swift会自动继承父类的指定初始化器 class B: A { required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
补充说明
如果之后你的类B需要添加自己的属性或者自定义初始化逻辑,再显式重写初始化器也完全没问题。现在这样的写法既符合Swift的初始化规则,又能保持代码的简洁性。
内容的提问来源于stack exchange,提问作者Priti Kanauziya
相关产品推荐
相关产品推荐

