Swift中如何复用UIHostingController的重载初始化器?
Swift中UIHostingController初始化器复用的正确实现
你遇到的问题源于Swift的初始化规则限制:指定初始化器必须先完成所有存储属性的赋值,再调用父类的super.init,而你写的第二个init(var1: Int)属于指定初始化器,直接调用self.init相当于在自身属性未初始化时引用self,这是Swift不允许的。
要复用初始化逻辑,正确的做法是把第二个初始化器改成便利初始化器(convenience init)——便利初始化器的核心规则就是必须先调用同一个类里的指定初始化器,再执行其他操作,刚好能满足逻辑复用的需求。
另外,由于UIHostingController继承自UIViewController,后者要求实现required init?(coder:)初始化器,所以你还需要补充这个方法的实现(如果不需要从Storyboard加载,直接返回nil即可)。
完整的正确代码如下:
public class ExampleViewController: UIHostingController<ExampleView> { public let var1: Int public let var2: String // 指定初始化器:负责完成所有存储属性赋值,调用父类初始化 public init(var1: Int, var2: String) { self.var1 = var1 self.var2 = var2 super.init(rootView: ExampleView(var1, var2)) } // 便利初始化器:调用指定初始化器复用逻辑 public convenience init(var1: Int) { self.init(var1: var1, var2: "") } // 必须实现的required初始化器 required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") // 若需要支持Storyboard加载,可修改为: // self.var1 = 0 // self.var2 = "" // super.init(coder: coder, rootView: ExampleView(0, "")) } }
这样修改后,两个初始化器就能复用指定初始化器中的逻辑,同时完全符合Swift的初始化规则,不会再出现编译错误。
内容的提问来源于stack exchange,提问作者user11799
相关产品推荐
相关产品推荐

