我有struct
设置,接受引用作为单个初始化参数:
internal struct NodeState: Equatable {
weak var node: Node! = nil
// ...
init(node: Node) {
self.node = node
}
}
我希望将NodeState
实例化为Node
类的成员,并传递self
以设置该弱引用:
public class Node: NSObject {
internal var state = NodeState(node: self)
// ...
}
...但我得到了这个奇怪的编译错误:
无法转换类型' NSObject - >的值() - >节点'预期参数类型'节点'
我不允许在Swift的成员声明中引用self
吗?
答案 0 :(得分:3)
通常,您不能在成员类声明中引用self
但是如果您使属性变为惰性并使用闭包初始化它,则可以。将您的Node
课改为这样的课程应该有效:
public class Node: NSObject {
internal lazy var staticState: NodeState = { NodeState(node: self) }()
}
这是有效的,因为懒惰属性在初始化self
之前不会被初始化。 self
必须先完全初始化才能使用。
答案 1 :(得分:2)
我不允许在Swift的成员声明中引用self吗?
排序。您无法引用8
(例如调用方法,将self作为参数传递),直到对象完全初始化为止。
在这种情况下你可以使用一个惰性变量,因为在初始化对象之前无法访问它。这是一个例子:
self
答案 2 :(得分:1)
在封闭中引用self?
public class Node: NSObject {
lazy var staticState: () -> (NodeState) = {
[unowned self] in
return NodeState(node: self)
}
}
我在闭包中明确地将self
装饰为unowned
以防止保留周期。