swift - 如何初始化依赖于初始化器参数以及“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*/
注意:我不是在寻找关于参考依赖周期的建议,只是针对所述问题。
解决方案
另一种方法是 声明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:没有尾随分号。
推荐阅读
- java - 应用程序启动时打开命令提示符
- ios - React Native - 在设备上没有任何触觉或振动工作?
- arduino - Arduino:包含 SD 库时,Oled 不工作
- python - Bot Discord Python:自动发送消息的问题
- r - R:处理“yaml”解析器错误
- angular - 移动到另一个组件时的角度句柄代码
- r - R - 如何将输出(NL API 翻译)作为现有 Tibble 中的新列添加?
- r - 无法访问存储在向量 R 中的 setRefClass 对象的属性
- typescript - 为什么通用告诉我属性不存在
- vue.js - NuxtJS 与使用 VueJS 的 ant design pro 布局