我是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*/
注意:我不是在寻求有关引用依赖周期的建议,而只是在陈述的问题上寻求帮助。
答案 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:没有尾随的分号。