升级到Swift 3后,属性'self.delegate'未在super.init调用时初始化

时间:2017-11-24 09:49:05

标签: ios swift3

升级到Swift 3后,我现在收到此错误:

  

属性'self.delegate'未在super.init调用中初始化

在NSObject类定义

open class NSObject : NSObjectProtocol {
   public init()  
}

IQKeyboardReturnKeyHandler类

public override init() {
   super.init()    //Error here
}

public init(controller : UIViewController) {
   super.init()    //Error here
   addResponderFromView(controller.view)
}

有关如何纠正此问题的任何建议吗?

1 个答案:

答案 0 :(得分:1)

我假设你的类IQKeyboardReturnKeyHandler你有这样的声明:

weak var delegate: YourDelegateProtocol

由于它既不是可选的也不是隐式展开的,你必须在调用超类的初始值设定项之前初始化

但是,使用委托模式,最好将您的委托属性声明为可选:

weak var delegate: YourDelegateProtocol?

在这种情况下,在调用超类的初始值设定项之前没有必要设置委托,因此您的代码将如下所示:

weak var delegate: YourDelegateProtocol?

public override init() {
    super.init()
    self.delegate = nil
}

public init(controller : UIViewController) {
    super.init()
    self.delegate = controller
    addResponderFromView(controller.view)
}

重要!使用委托模式时,始终将您的委托属性声明为以避免reference cycles