/ / Referencia `self 'en la declaración de miembro de Swift. Swift

Referencia `self` en la declaración de miembro de Swift instance - swift

tengo un struct Configuración que acepta una referencia como un único parámetro de inicialización:

internal struct NodeState: Equatable {
weak var node: Node! = nil
// ...

init(node: Node) {
self.node = node
}
}

Quiero instanciar un NodeState como miembro de la Node clase, pasando self en para establecer esa referencia débil:

public class Node: NSObject {
internal var state = NodeState(node: self)
// ...
}

... pero estoy recibiendo este extraño error de compilación:

No se puede convertir el valor del tipo "NSObject -> () -> Node" al tipo de argumento esperado "Node"

¿No se me permite hacer referencia? self en una declaración de miembro en Swift?

Respuestas

3 para la respuesta № 1

En general no puede "t referencia" self en una declaración de clase de miembro, pero puede hacerlo si hace que la propiedad sea perezosa y la inicialice con un cierre. Cambiando tu Node clase a algo como esto debería funcionar:

public class Node: NSObject {
internal lazy var staticState: NodeState = { NodeState(node: self) }()
}

Funciona porque la propiedad perezosa no se inicializa hasta después self se inicializa. self tiene que ser completamente inicializado antes de que pueda ser utilizado.


2 para la respuesta № 2

¿No se me permite hacer referencia a uno mismo en una declaración de miembro en Swift?

Una especie de Usted no puede "t referencia" self (por ejemplo, métodos de llamada, pasando auto como parámetro) hasta que el objeto esté completamente inicializado.

En este caso, podría usar una var vaga, que funcionaría ya que no se puede acceder hasta que se inicialice el objeto. Aquí hay un ejemplo:

public class Node: NSObject {
internal lazy var staticState: NodeState = {
return NodeState(node: self)
}()
}

1 para la respuesta № 3

Referencia a sí mismo en un cierre?

public class Node: NSObject {

lazy var staticState: () -> (NodeState) = {
[unowned self] in
return NodeState(node: self)

}
}

Estoy decorando explícitamente self como unowned En el cierre para evitar un ciclo de retención.