2014-09-14 3 views
7

Есть ли свойство ivar, которое мы должны использовать в Swift getter? Мой код вызывает сорбент не вызывать поглотитель до критических сбоев программы:Быстрое свойство - геттер ivar

var document: UIDocument? { 
    get { 
     return self.document 
    } 
    set { 
     self.document = newValue 

     useDocument() 
    } 
} 

ответ

16

Swift свойство не имеет понятия отдельных, лежащий в основе памяти, как они делают в Objective-C. Вместо этого вам нужно создать вторую (частную) собственность и использовать его в качестве хранилища:

private var _document: UIDocument? 
var document: UIDocument? { 
    get { 
     return _document 
    } 
    set { 
     _document = newValue 
     useDocument() 
    } 
} 

Если все, что вы пытаетесь сделать, это вызов useDocument() после свойства document установлено, вы можете опустить геттер, сеттер и частная собственность, а вместо этого просто используйте willSet или didSet.

+0

Я добавил примечание к ответу, что если ваш фактический код этой простой, вы можете просто использовать 'willSet' или' didSet'. –

+0

Первоначально я использовал 'didSet', но мне нужно' useDocument' запускать до инициализации свойства. (Он задан в представленном VC 'prepareForSegue' –

+0

' useDocument' по-прежнему не вызывается, когда свойство инициализируется в представленном VC 'prepareForSegue' –

2

В вашем коде есть бесконечная ситуация рекурсии: например, self.document внутри геттера продолжает называть геттер.

Вам необходимо прямо определить ivar самостоятельно. Вот одно из возможных решений:

private var _document:UIDocument? 

var document: UIDocument? { 
    get { 
     return self._document 
    } 
    set { 
     self._document = newValue 

     useDocument() 
    } 
} 
7

Если то, что вы пытаетесь достичь, это добавить собственную обработку, когда свойство установлено, что вам не нужно, чтобы определить отдельный элемент подложки данных и осуществлять вычисляемое свойство: вы можно использовать willSet и didSetнаблюдателей собственности, которые автоматически вызываются соответственно перед тем и после свойство было задано.

В вашем конкретном случае, это то, как вы должны реализовать свою собственность:

var document: UIDocument? { 
    didSet { 
     useDocument() 
    } 
} 

Рекомендуемая литература: Property Observers

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