首页 > 解决方案 > 如何初始化依赖于初始化器参数以及“self”的类属性?

问题描述

我是一个新的 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*/}
}

我可以使该属性成为显式展开的可选项,但这对我来说感觉不对,因为我不想产生与可选项相关的成本(该变量将在紧密循环中访问)。这个假设是错误的吗?显式展开的选项是否提供与常规 a 相当的性能,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*/

注意:我不是在寻找关于参考依赖周期的建议,只是针对所述问题。

标签: swift

解决方案


另一种方法是 声明consumer以避免保留循环(持有强引用,反之亦然)Supplierweak optionalConsumerSupplier

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:没有尾随分号。


推荐阅读