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 № 1En 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.