You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何将可变Array作为@State私有属性的初始值

报错原因

Swift 初始化安全检查要求:所有存储属性完成赋值之前,不允许访问self的任何成员。你原有代码中init里访问的News本质是self.News,此时newssitearray还未完成初始化,self处于不可用状态,因此触发报错。

解决方案

方案1:在init内优先构造数据实例(推荐)

先在init的局部作用域构造getNews实例,不需要访问self即可完成两个属性的初始化:

@ObservedObject var News: getNews
@State private var newssitearray : [String]

init() {
    // 局部构造实例,不涉及self访问
    let newsInstance = getNews()
    // 先初始化ObservedObject包装属性
    _News = ObservedObject(wrappedValue: newsInstance)
    // 用局部实例给State赋值,全程不访问self
    _newssitearray = State(initialValue: newsInstance.data.map {$0.newsSite})
}

该方案的优势是初始化阶段就完成了数据赋值,不会出现界面刚加载时数据为空的情况。

方案2:给State设置默认初始值,生命周期方法中赋值

如果不需要初始化阶段就拿到完整数据,可以给数组设置空默认值,在视图加载完成后赋值:

@ObservedObject var News = getNews()
// 先给空数组作为默认值,完成存储属性初始化
@State private var newssitearray : [String] = []

var body: some View {
    // 你的原有视图内容
    List(newssitearray, id:\.self) { item in
        Text(item)
    }
    .onAppear {
        newssitearray = News.data.map {$0.newsSite}
    }
    // 如果News.data会异步更新,可以加监听同步数据
    .onChange(of: News.data) { newValue in
        newssitearray = newValue.map {$0.newsSite}
    }
}

内容的提问来源于stack exchange,提问作者jesse voorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:09:03