Подтвердить что ты не робот

Свойство '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
4b9b3361

Ответ 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
}