2016-05-25 2 views
0

Почему этот код вызовет didSet при инициализацииSwift триггер didSet при инициализации

final public class TestDidSet { 

static var _shared: TestDidSet! = TestDidSet() 

func testA() { } 

private var test = true { 
    didSet { 
     print("didSet test when initing!!!!!:\(test)") 
    } 
} 
private var _value: Bool! { 
    didSet { 
     print("didSet when initing!!!!!:\(_value)") 
    } 
} 

private init() { 
    testSet() 
    _value = false 
    test = false 
} 

private func testSet() { 
    _value = true 
} 
} 

TestDidSet._shared.testA() 

любая идея? Должен ли он не запускать didSet? кто-то поможет!

обновление: Моя точка зрения это, testSet() и _value = false делает то же самое, но testSet() вне init(), так testSet() вызовет didSet пока _value = false нет. Зачем?!

Это не факультативный тип или другая причина, которая вызывает «didSet», я полагаю.

+0

Что вам нужно? вызов testSet() приведет к срабатыванию вашего файла setSet, в то время как значение присваивания не приведет к срабатыванию функции didSet в init. –

+2

[Этот комментарий объясняет это хорошо.] (http://stackoverflow.com/questions/25230780/is-it-possible-to- allow-didset-to-be-called-in-initialization-in-swift # comment39303335_25231068) – Hamish

+0

'didSet' - это сеттер в Swift, такой же' - (void) setTest: (Bool) test; 'в Objective-C. Поэтому он будет вызывать, когда вы присвоите любое значение 'test'. Это не событие его сеттера. – TheTiger

ответ

1

Когда вы объявляете свойство с неявным образом развернутым необязательным типом (Bool! в вашем случае), ему неявно назначается значение по умолчанию nil. Затем после этого, если вы назначите его другим значением в вашем инициализаторе, тогда будет вызван наблюдатель didSet, потому что он уже назначен . didSet предполагается не запускать только на первом.

+1

Ничего о том, сколько раз я использую '_value = false', он всегда будет не запускать' didSet', пока этот код находится в 'init()' – InvokerLaw

+0

Да, потому что тип свойства - 'Bool!'. Если вы измените его на простой 'Bool' (и сделайте необходимую настройку, чтобы не было разрешено запускать методы экземпляра до того, как все свойства были инициализированы), вы заметите, что самое первое задание не вызывает наблюдателя, и все это делает. – courteouselk

-2

didSet{} закрытия называется каждый раз, когда вы присвоить новое значение в свойствах (даже если вы назначаете его в декларации (рядный) или при инициализации).

+0

'Наблюдатели willSet и didSet свойств суперкласса вызывается, когда свойство задается в инициализаторе подкласса после того, как был вызван инициализатор суперкласса. Они не вызывается, когда класс устанавливает свои собственные свойства, прежде чем вызывается инициатор суперкласса. 'См.: [Developer.apple.com] (https://developer.apple.com/library/content/documentation/Swift /Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID262) – dkoch

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