Свойство 'self. *' Не инициализировано при вызове super.init
Я только что обновил свой 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
Ответы
Ответ 1
Вы должны инициализировать все свойства до вызова super.init
в любом методе init
Итак, измените это, прежде чем вы вызовете super.init()
originView = sourceView //error here
Исключение:
- необязательное свойство
- свойство со значением по умолчанию
- ленивое свойство
Ответ 2
Сделайте свой originView
допустимым с нулевым значением
var originView: UIView?.
Если ваш originView
не имеет значения NULL, вы должны указать значение по умолчанию перед вызовом
super.init().
Ответ 3
Из книги Apple "Язык быстрого программирования":
"Компилятор Swifts выполняет четыре полезных safety-checks
, чтобы убедиться, что двухфазная инициализация завершена без ошибок"
"Назначенный инициализатор должен гарантировать, что все" свойства, введенные его классом, будут инициализированы до того, как он делегирует до инициализатора суперкласса ".
В основном вы должны 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
}