一尘不染

在Swift中进行属性声明时引用self

swift

我正在尝试使用以下代码声明和初始化属性。

class ClassName: UIViewController {

  private let doneButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "doneButtonDidTapped")

   func doneButtonDidTapped() {
      println("Ulala!")
   }
}

但是,出现以下错误。

Cannot find an initializer for type 'UIBarButtonItem' that accepts an argument list of type '(title: String, style: UIBarButtonItemStyle, target: ClassName -> () -> ClassName, action: String)'

有人知道这是怎么回事吗?我应该放弃使用声明内联初始化属性的尝试,而是对init()方法进行初始化吗?


阅读 281

收藏
2020-07-07

共1个答案

一尘不染

正如@giorashc所说,由于swift的两阶段初始化,self尚未被初始化,因此您不能这样做。

但是我认为您可以创建一个懒惰的初始化:

lazy private var doneButtonItem : UIBarButtonItem = {
    [unowned self] in
    return UIBarButtonItem(title: "Done", style:UIBarButtonItemStyle.Plain, target: self, action: "doneButtonDidTapped")
    }()
2020-07-07