Swift willSet内的延迟初始化问题

Swift willSet内的延迟初始化问题,swift,lazy-initialization,Swift,Lazy Initialization,我试图创建可选数组,但我希望仅在将元素追加到之前初始化 于是我写道: var names: [String]? { willSet { if names == nil { names = [] } } } 但我得到了这个错误: 试图在其自己的willSet中存储到属性“names”,这 即将被新值覆盖 如果你想要一个懒惰的酒吧,那么你应该像 lazy var name

我试图创建可选数组,但我希望仅在将元素追加到之前初始化

于是我写道:

    var names: [String]? {
        willSet {
            if names == nil {
                names = []
            }
        }
    }
但我得到了这个错误:

试图在其自己的willSet中存储到属性“names”,这 即将被新值覆盖


如果你想要一个懒惰的酒吧,那么你应该像

lazy var names: [String] = []

我不确定你的目标是什么。但似乎您不希望可选数组永远为零。。。那么为什么不让它成为非可选的呢?@Fogmeister我只想在使用数组时初始化它,它是可选的,因为无论您试图做什么,它都有可能在程序中根本不会初始化,并且只与错误消息有关:问自己:这个错误是什么时候发生的?当您试图将
names
的新值设置为某个值时,会发生这种情况,例如设置为
[“John”,“Jack”]
…事件的顺序是什么?该序列将尝试将其设置为
[]
,该序列将始终被覆盖为[“John”,“Jack”],因为您在
中写入的内容将设置为[/code>…这意味着它将在设置之前发生。@Honey
该序列将尝试将其设置为[],该序列将始终被覆盖为[“John”,“Jack”]因为您在willSet中写入了它
我之前检查它是否为零,然后只设置为空array@ULAQ不要担心分配空数组的成本——您正在尝试执行过早的优化,这会给代码增加不必要的复杂性。只需将
名称
设置为非可选,并使用空数组初始化即可。