在Swift实例成员声明中引用`self`

时间:2016-04-26 21:27:31

标签: swift

我有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吗?

3 个答案:

答案 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以防止保留周期。