2014-09-13 2 views
19

Я преобразовываю проект в код Swift и сталкиваюсь с проблемой в сеттере. Моя Objective-C код выглядит следующим образом:Swift - Пользовательский сеттер по свойству

- (void)setDocument:(MyDocument *)document 
{ 
    if (![_document isEqual:document]) { 
     _document = document; 

     [self useDocument]; 
    } 
} 

и позволил моему View Controller для запуска этого каждый раз, когда документ был установлен (обычно в prepareForSegue: методом предлежащей View Controller).

Я нашел наблюдателей недвижимости willSet и didSet, но они работают только при обновлении объекта, а не при его инициализации и обновлении.

Любые идеи? Благодаря

UPDATE

после попытки GET {} и множество {} Я получаю ошибку EXC_BAD_ACCESS

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

     useDocument() 
    } 
} 
+0

Не использовать наблюдатель собственности. Используйте get {} и получите {}. Ознакомьтесь с разделом «Вычислимые свойства» [здесь] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html). –

ответ

41

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

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

private var _document: UIDocument? = nil 
var document: UIDocument? { 
    get { 
     return self._document 
    } 
    set { 
     self._document = newValue 
     useDocument() 
    } 
} 
+22

['didSet'] (http://stackoverflow.com/a/24334029/187663) кажется более подходящим. – Cfr

+16

Я не понимаю, почему компилятор явно просит добавить себя в сеттер, если результатом будет бесконечный цикл. Я единственный, кто думает, что это не элегантное решение для использования частного var? Функция getter и setter улучшит работу –

+3

Swift - это незавершенная работа. Есть много таких мелочей, которые я надеюсь, что Apple заставит компилятор автоматически выполнять грязную работу для вас, чтобы вы могли просто сконцентрироваться на кодировании, вместо того, чтобы постоянно быть похожим на «arrrrgh» – CommaToast

1

Вот Swift 3 версии

var document : UIDocument? = nil { 
    didSet { 
     useDocument() 
    } 
} 
Смежные вопросы