2015-04-10 3 views
0

У меня есть этот код:Swift 1.2: 'я' используется до super.init вызова

class SomeViewController : UIViewController { 

let deferred :()->() 

required init(coder aDecoder : NSCoder) { 
    deferred = { 
     self.doSomething() 
    } 

    super.init(coder: aDecoder) 
} 

func doSomething() { 
    // Does things.... 
} 

} 

В Swift 1.2 это не удается скомпилировать с ошибкой:

'сам' использовали до super.init звонок

В течение до 1.2 дней мы можем обращаться к нему несколькими способами, такими как неявно разворачиваемые условные обозначения. Такой подход не будет работать.

Я видел, что другие ответы ссылаются на двухэтапную инициализацию или ленивый декоратор, но обе жертвуют неизменностью свойства. Разумеется, это должно быть разрешено в Swift 1.2, но у меня нет идей.

+2

Есть ли причина, по которой вы не можете просто перевести вызов на 'super' * до * вы используете' self'? Это именно то, о чем говорит вам ошибка, и я не вижу причин, чтобы посмотреть на код, почему это не должно быть хорошо, и вы не объяснили никакой причины. – nhgrif

+2

@nhgrif: Но вы не можете называть 'super.init()' before' self' (включая свойство 'deferred') полностью инициализированным. –

+0

@MartinR О, я вижу. Теперь имеет смысл. Кроме того ... если бы это сработало, не создало бы цикл сохранения на 'self'? – nhgrif

ответ

2

Вот промежуточный обходной путь:

private(set) var deferred :()->() = { } 

required init(coder aDecoder : NSCoder) { 
    super.init(coder: aDecoder) 
    self.deferred = { 
     self.doSomething() 
    } 

} 

Мое мышление, хорошо, мы сделали «жертву неизменность собственности», но с точки зрения общественной собственности остается неизменен, потому что сеттер является частным.

+0

Я напишу это. Благодарю. – MattD

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