gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:25:11 30 4
gpt4 key购买 nike

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

注意:我不是在寻找关于引用依赖周期的建议,只是在陈述的问题上。

最佳答案

另一种方法是将 Supplier 中的 consumer 声明为 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:没有尾随分号。

关于swift - 如何初始化依赖于初始化参数和 `self` 的类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56954943/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com