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
相关产品推荐
相关产品推荐

