2015-08-20 2 views
-1

Я хотел бы использовать утверждения внутри init(), прежде чем он называет super.init(). Они предназначены для проверки некоторых инвариантных условий при вычислении локальных свойств.Невозможно разместить утверждения Swift внутри init() перед вызовом super.init()

Однако, если я пытаюсь место таких утверждений я получаю сообщение об ошибке:

«я» использовала до super.init вызова

Я предполагаю, что это потому, что утверждает, печатает описание объект и, следовательно, использует self, который на этом этапе еще не полностью инициализирован. Есть ли что-нибудь, что я могу сделать с этим (то есть рассчитать локальные свойства до вызова super.init() и разместить там там утверждения).

ОБНОВЛЕНИЕ Ниже приведен пример кратким:

class Test: NSObject { 
    let x: Int 

    override init() { 
     x = 1 
     assert(x == 1) // causes error 
     super.init() 
     assert(x == 1) // no error 
    } 
} 
+0

Показать код, что вы пытаетесь сделать ... В то же время, читайте [Swift Утверждает] (Http: // блог .krzyzanowskim.com/2015/03/09/swift-asserts-the-missing-manual /), а также знать все альтернативы/пути ... – robertvojta

+0

@robertvojta Я добавил пример (с тривиальной логикой инициализации). – Drux

ответ

0

Причина заключается в том, что assert должен прочитать значение свойства x.
Хотя вы можете опустить self в качестве удобного синтаксиса assert использует неявный setter свойства и должен позвонить self.x == 1.

Это сообщение об ошибке.

Вы можете использовать временные локальные переменные, чтобы рассчитать, что вам нужно, но вы не можете использовать переменные экземпляра перед вызовом super.init().

В качестве альтернативы использовать struct или тип, который не требует, чтобы позвонить super.init()

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