2014-10-12 3 views
1

Я использую XLForm, который имеет класс XLFormDescriptor, который должен быть инициализирован init(title: String).Не удалось инициализировать свойство с помощью Swift

Название, которое я хочу использовать, - это возвращаемое значение функции имени моего текущего класса (свойства уровня класса еще не являются функцией).

Сведя на уровне класса, код, чтобы настроить его внешний вид, как это:

let settingsForm = XLFormDescriptor(title: self.name()) 

Но это дает ошибку:

'PanelController ->() -> PanelController!' does not have a member named 'name'

Собираем это в верхней части инициализации в класса вызов выглядит следующим образом:

let settingsForm: XLFormDescriptor 

override init() { 
    self.settingsForm = XLFormDescriptor(title: self.dynamicType.name()) 

    super.init() 
} 

И делать это дает эту ошибку:

'self' used before super.init call

Собираем после super.init() дает эту ошибку:

Property 'settingsForm' not initialized at super.init call

Любые идеи, как я могу возможно сделать это?

EDIT: Обойти это сделать это:

let settingsForm = XLFormDescriptor(title: "") 

override init() { 
    super.init() 
    self.settingsForm = XLFormDescriptor(title: self.dynamicType.name()) 
} 

ответ

1

В быстры, self не доступен, пока все свойства класса не были инициализированы. Для этого есть проверка на время компиляции.

Так что если у вас есть класс со свойствами, унаследованных от другого класса:

class A { 
    var prop1: Int 
    init(val1: Int) { 
     self.prop1 = val1 
    } 
} 

class B : A { 
    var prop2: String 
    override int(val1: Int, val2: String) { 
     // First initialize properties of this class 
     self.prop2 = val2 

     // Next call a superclass initializer 
     super.init(val1: val1) 

     // From now on, you can use 'self' 
    } 
} 

вы не можете использовать self до всех (не дополнительный) свойство класса было инициализирована и суперкласса инициализатор имеет (если класс унаследован).

Если инициализировать свойство инлайн, например:

let settingsForm = XLFormDescriptor(title: self.name()) 

вы явно с помощью self перед экземпляром класса был правильно инициализирован - это причина ошибки компиляции.

Решение, которое вы нашли, не является обходным путем, но правильным способом это сделать. Сначала вы инициализируете свойство со значением, не связанным с self, а затем, как только класс был инициализирован, вы присваиваете этому свойству новое значение.

Обратите внимание, что это единственный случай, когда вам разрешено назначать новое значение неизменяемому свойству, если оно выполняется из инициализатора.

Для лучшего понимания того, как работает инициализация, я рекомендую ознакомиться с соответствующей документацией: Initialization

Смежные вопросы