为何代码中出现‘Initializer chaining ('super.init') cannot be nested in another expression’错误?
错误原因分析及修复方案
错误原因
Swift初始化规则明确要求:必须在初始化方法的直接作用域内完成父类初始化调用(super.init),不能把super.init嵌套在闭包、函数调用这类子表达式里。
你代码里把super.init放在了someFunction的闭包参数中,这违反了Swift初始化链的执行顺序——父类初始化必须在当前类的初始化逻辑(除闭包延迟执行部分)完成后,直接在init方法的顶层执行,不能被延迟到闭包的异步/后续执行流程里。
修复方案
把super.init移到init方法的直接作用域中,闭包只处理self.something的赋值(如果someFunction是异步的,记得处理线程安全问题):
final class HomeViewController : someBaseClass { var something: SomethingProtocol! // 或根据实际场景定义为可选类型 init(something: SomethingProtocol) { super.init(nibName: Self.nibName(), bundle: Bundle.main) someFunction { [weak self] in self?.something = something } } // 若父类有required初始化方法,需补充实现 required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
注意点:
- 若
someFunction是异步执行,建议用[weak self]捕获列表避免循环引用 self.something需提前声明,可根据实际需求选择隐式解包可选类型(!)或普通可选类型(?)
内容的提问来源于stack exchange,提问作者grabz
相关产品推荐
相关产品推荐

