Swift 4.1报错:super.init调用前调用defaultConfiguration方法求助
解决 "self used method call 'defaultConfiguration' before 'super.init' call" 错误
嘿,这个问题其实是Swift严格的初始化规则在搞鬼——咱们得先完成父类的初始化(也就是调用super.init),才能访问当前类的实例方法,因为在super.init执行完之前,self还没完全初始化完成,自然不能调用依赖它的方法。
具体解决方案
核心思路就是把defaultConfiguration()从实例方法改成类方法或者静态方法,这样不用依赖实例就能调用它,也就避开了self未初始化的问题。
第一步:修改defaultConfiguration的定义
找到你当前类里defaultConfiguration()的实现,把它改成类方法(如果要允许子类重写)或者静态方法(不需要重写的话):
// 允许子类重写用class func class func defaultConfiguration() -> ConfigurationType { // 把你原来的配置代码放这儿就行,不用改逻辑 } // 不需要子类重写的话用static func更合适 static func defaultConfiguration() -> ConfigurationType { // 原逻辑保持不变 }
第二步:更新初始化方法里的调用
把初始化方法里的defaultConfiguration()改成用类名调用(比如你的类叫YoutubePlayer,就写YoutubePlayer.defaultConfiguration()):
public init(frame: CGRect = .zero, playerVars: [String: AnyObject]) { // 用类名直接调用类方法,不用self super.init(frame: frame, configuration: YourClassName.defaultConfiguration()) commonInit() self.playerVars = playerVars } public init(frame: CGRect = .zero, playerVars: [VideoEmbedParameter] = []) { super.init(frame: frame, configuration: YourClassName.defaultConfiguration()) commonInit() guard !playerVars.isEmpty else { return } var params: [String: AnyObject] = [:] playerVars.forEach { let property = $0.property params[property.key] = property.value } self.playerVars = params }
为啥这招管用?
类方法和静态方法属于整个类本身,不是某个具体实例的,所以在实例还没初始化的时候,咱们直接通过类名就能调用它们,完全不会触发self未初始化的错误。
如果defaultConfiguration()原本不需要访问任何实例属性,那这个修改完全不会影响原有功能;要是它确实需要用到实例属性,那你可能得把那些属性改成类属性,或者调整配置逻辑到super.init之后再处理(不过这种情况不多,毕竟默认配置一般都是通用的,适合用类方法提供)。
内容的提问来源于stack exchange,提问作者Bettaieb Amine
相关产品推荐
相关产品推荐

