属性'self。*'没有在super.init调用中初始化

我只是更新我的xcode到6.3.1。 问题是我得到这个奇怪的错误信息,因为迅速1.2。 我得到了这种错误信息

/Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.swift:32:15: Property 'self.originView' not initialized at super.init call /Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.swift:38:20: Immutable value 'self.originView' may only be initialized once 

在这个代码上

 let originView:UIView? override init() { super.init() //error here } init(sourceView:UIView, menuItems:Array<String>){ super.init() //error here originView = sourceView //error here 

请指教。 谢谢。

在任何init方法中调用super.init之前,必须初始化所有属性

所以,在你调用super.init()之前,

 originView = sourceView //error here 

例外:

  1. 可选属性
  2. 财产与默认值
  3. 懒惰的财产

让你的originView

 var originView: UIView?. 

如果您的originView不可为空,您必须在调用之前提供一个默认值

 super.init(). 

从苹果的“Swift编程语言”一书中:

“Swift的编译器执行四个有用的safety-checks ,以确保两相初始化完成没有错误”

“一个指定的初始化器必须确保所有的”由它的类引入的属性在被委托给一个超类初始化器之前被初始化“。

基本上你必须ensure that your instance variables are in a consistent state做任何事之前ensure that your instance variables are in a consistent state ,包括调用方法。

 class YourClass { var view: UIView init(view: UIView) { self.view = view } } 

以及你的情况,你可以使它成为一个新的UIView

 let originView = UIView() 

或者可以为

 let originView: UIView? 

或者改成一个懒惰的属性

 lazy var originView: UIView = { let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200)) // customize it return view }() 

当使用懒惰的实例时,你可以传递一个方法:

 lazy var originView: UIView = self.createView() func createView() -> UIView { let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200)) // customize it return view }