2016-11-28 4 views
1

Я не хочу, чтобы инициализировать контроллер представления, пока я не должен показывать свою точку зрения, так что я его ленивым вар, как:.Есть ли способ узнать, был ли инициализирован ленивый var?

lazy var foo: NSViewController! = { 
    let foo = NSViewController() 
    foo.representedObject = self.representedObject 
    return foo 
}() 

// ... 

override var representedObject: Any? { 
    didSet { 
     if foo != nil { 
      foo.representedObject = representedObject 
     } 
    } 
} 

self.representedObject установлен перед тем foo когда-либо ссылки, но каждый раз, Я называю if foo != nil инициализирует foo: с

есть ли способ, что я могу проверить, если foo имеет уже были установлены?

ответ

4

lazy - это всего лишь удобная обертка вокруг одного конкретного шаблона создания ленивого экземпляра (и того, который только умеренно полезен). Если вы хотите свой собственный шаблон, не используйте ленивый; просто создайте его самостоятельно.

private var _foo: NSViewController? = nil 
var foo: NSViewController { 
    if let foo = _foo { 
     return foo 
    } 

    let foo = NSViewController() 
    foo.representedObject = self.representedObject 
    _foo = foo 
    return foo 
} 

// This can be private or public, as you like (or you don't technically need it) 
var isFooLoaded: Bool { 
    return _foo != nil 
} 

override var representedObject: Any? { 
    didSet { 
     if !isFooLoaded { 
      foo.representedObject = representedObject 
     } 
    } 
} 

Это предназначено следовать isViewLoaded шаблон, который адресует ту же самую основную проблему.

+0

Итак, не существует способа определить, была ли указана опция «lazy var» раньше? –

+1

Я уверен, что есть какой-то способ, если вы распакуете свою собственную структуру данных как небезопасную память. Это было бы фантастически хрупким, но все в конечном счете было бы просто байтами, поэтому оно должно быть где-то узнаваемо. Но с точки зрения «можно ли это сделать безопасно и проще, чем выше?» Я так не верю. 'lazy' - очень простой, жестко закодированный шаблон, и он не раскрывает его внутренности. –

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