Xcodeを6.3.1に更新しました。問題は、Swift 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
例外:
originView
をnull可能にする
var originView: UIView?.
originView
をnullにできない場合は、呼び出す前にデフォルト値を指定する必要があります
super.init().
Appleの「Swiftプログラミング言語」の本から:
「Swiftのコンパイラは4つの役立つsafety-checks
2フェーズの初期化がエラーなしで完了することを確認します」
「指定された初期化子は、「そのクラスによって導入されたすべてのプロパティが、スーパークラスの初期化子に委任される前に初期化されることを保証する必要があります。」
基本的にはensure that your instance variables are in a consistent state
メソッドの呼び出しなど、何かを行う前。
class YourClass {
var view: UIView
init(view: UIView) {
self.view = view
}
}
あなたの場合はそれをnew UIViewにすることができます:
let originView = UIView()
またはそれを作るnullable
let originView: UIView?
または、代わりにlazy propertyを作成します。
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
}