如何初始化依赖于初始化程序参数和`self`的类属性?

时间:2019-07-09 14:34:06

标签: swift

我是Swift的新开发人员。是否有合适的模式来初始化其初始值设定项需要引用self的类变量?

示例代码:

class Consumer
{
    var supplier: Supplier;

    init(observer: Observer)
    {
        // error: 'self' used before all stored properties are initialized
        self.supplier = Supplier(observer: observer, consumer: self);
    }
}

class Observer {}

class Supplier
{
    init(observer: Observer, consumer: Consumer) {/*do init*/}
}

我可以使该属性成为显式展开的可选对象,但这对我来说是错误的,因为我不想招致与可选对象相关的成本(此变量将在紧密的循环中访问)。这个假设错了吗?显式展开的可选选项是否提供与常规var相当的性能,还是在访问时仍对其进行检查?

class Consumer
{
    var supplier: Supplier!; // explicitly unwrapped Optional

    init(observer: Observer)
    {
        /*
        pro: problem solved
        con?: accessing supplier incurs the costs of accessing an Optional?
        */
        self.supplier = Supplier(observer: observer, consumer: self);
    }
}

/*other classes*/

我可以有一个额外的变量来首先初始化该类,然后再有一个惰性变量来使用self,但是随后我将一个多余的变量存储在该类中,此后实际上并不需要初始化。

class Consumer
{
    var observer: Observer; // never used elsewhere after initialization
    lazy var supplier: Supplier = Supplier(observer: observer, consumer: self);

    init(observer: Observer)
    {
        /*
        pro: problem solved
        con: small memory overhead
        */
        self.observer = observer;
    }
}

/*other classes*/

注意:我不是在寻求有关引用依赖周期的建议,而只是在陈述的问题上寻求帮助。

1 个答案:

答案 0 :(得分:3)

另一种方法是在consumer中将Supplier声明为weak optional,以避免保留周期(Consumer强烈引用Supplier,反之亦然)

class Consumer
{
    let supplier: Supplier

    init(observer: Observer)
    {
        self.supplier = Supplier(observer: observer)
        supplier.consumer = self
    }
}

class Observer {}

class Supplier
{
    let observer : Observer
    weak var consumer : Consumer?

    init(observer: Observer, consumer: Consumer? = nil) {
        self.observer = observer
        self.consumer = consumer
    }
}

这是Swift:没有尾随的分号。