vez tutorial programar para objective español entre diferencias and ios swift

ios - programar - swift tutorial español



¿Sabes cuándo una var débil se vuelve nula en Swift? (1)

Digamos que tengo una weak var view: UIView? en mi class Button {} . ¿Hay alguna forma de saber cuándo la view pierde su referencia y se vuelve nil ?

Traté de usar weak var view: UIView? {} weak var view: UIView? {} (también conocida como una propiedad computada) para anular el set {} , pero eso no funcionó porque ahora es una propiedad computada y no puede almacenar una referencia débil (¡qué molesto!).

Editar:

La respuesta de @fqdn no funcionó con este código ... Pruébelo en un patio de Xcode

import UIKit class Test { weak var target: UIView? { willSet { if !newValue { println("target set to nil") } else { println("target set to view") } } } } class Button { var view: UIView? = UIView() } var t = Test() var b = Button() t.target = b.view b.view = nil // t.target''s willSet should be fired here

Su consola de salida debe mostrar:

target set to view target set to nil

Mi consola muestra

target set to view

b.view es la referencia fuerte para la instancia UIView. t.target es la referencia débil. Por lo tanto, si b.view se establece en nil , la instancia de UIView se desasigna y t.target será igual a nil.


Si su botón contiene una referencia a otra vista, debe ser un propietario de esa vista (es decir, debe tener una referencia fuerte) o no debe importarle cuándo esa vista se va (es decir, su referencia débil a ella se vuelve nula). .) No hay notificación cuando las referencias débiles se vuelven nulas, y eso es por diseño.

En particular, no se llama a los observadores de la propiedad Swift cuando las referencias débiles se vuelven nulas, como lo demuestra el siguiente código:

class A : CustomStringConvertible { var s: String? init(s: String) { self.s = s; print("/(self) init") } deinit { print("/(self) deinit") } var description: String { get { return "[A s:/(s ?? "nil")]" } } } class B : CustomStringConvertible { weak var a:A? { willSet { print("/(self) willSet a") } didSet { print("/(self) didSet a") } } init(a: A?) { self.a = a print("/(self) init") } deinit { print("/(self) deinit") } var description: String { get { return "[B a:/(a == nil ? "nil" : String(describing: a!))]" } } } func work() { var a: A? = A(s: "Hello") var b = B(a: a) print("/(b)") a = nil print("/(b)") b.a = A(s: "Goodbye") } work()

Cuando se llama a work() , la consola da el siguiente resultado:

[A s:Hello] init [B a:[A s:Hello]] init [B a:[A s:Hello]] [A s:Hello] deinit [B a:nil] [A s:Goodbye] init [B a:nil] willSet a [B a:[A s:Goodbye]] didSet a [A s:Goodbye] deinit [B a:nil] deinit

Observe que en ningún caso de la instancia de A desasignada y su referencia débil en el caso de que B sea nula, se llama a los observadores de propiedad. Sólo en el caso directo de asignación a Ba se llaman.