不能在属性初始值设定项中使用实例成员'dateType';属性初始值设定项在 'self'可用之前运行



我是SwiftUI的新手,无法绕过这个错误。我试图在同一初始值设定项中的另一个数组中使用两个@State变量(isGlobal和dataType(。

我不断得到错误:"无法在属性初始值设定项中使用实例成员"dateType";属性初始值设定项在"self"可用之前运行;和"无法在属性初始值设定项中使用实例成员"isGlobal";属性初始值设定项在"self"可用之前运行;

这是视图开头的代码:

struct Home : View {
@State var dateType : Int
@State var isGlobal = true
@State var dailyVax = [

DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 6))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 6))", show: true),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 5))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 5))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 4))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 4))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 3))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 3))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 2))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 2))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 1))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 1))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 0))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 0))", show: false),
]
var body: some View { ...

这是[每日疫苗接种]结构:

struct DailyVaccinations : Identifiable {
var id = UUID().uuidString
var day : String
var value : String
var show : Bool

}

这是实际使用";dailyVax";阵列:

ForEach(dailyVax.indices,id: .self){i in


GraphView(data: dailyVax[i], allData: dailyVax)
.onTapGesture {

withAnimation{

for index in 0..<dailyVax.count{
dailyVax[index].show = false
}
dailyVax[i].show.toggle()
}

}

if dailyVax[i].value != dailyVax.last!.value {
Spacer(minLength: 0)
}

} ...

如果有人能帮我解决这个问题,我将不胜感激!谢谢

您收到此错误消息是因为您正试图访问初始化器内部的isGlobaldateType

当所有的值都还没有定义时,你不能这样做,因此;在自身可用之前";在错误消息中。

要解决此问题,请编写一个自定义初始值设定项:

init(dateType: Int, isGlobal: Bool = true) {
self.dateType = dateType
self.isGlobal = isGlobal

self.dailyVax = [
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 6))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 6))", show: true),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 5))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 5))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 4))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 4))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 3))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 3))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 2))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 2))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 1))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 1))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 0))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 0))", show: false)
]

// Note that all values are being given a value in the initializer (dateType, isGlobal, and dailyVax)

}

通过这样做,SwiftUI知道在更改和/或使用初始化器中提供的任何其他值之前,所有值都已初始化。我对SwiftUI也很陌生,但这是我对它的理解。有关初始化程序如何工作以及它们可以做什么的更多信息,我建议在谷歌上搜索更多关于这个主题的信息,和/或访问Swift官方文档:

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

这就是你的代码最终应该是什么样子的:

struct Home : View {
@State var dateType: Int
@State var isGlobal: Bool

@State var dailyVax: [DailyVaccinations]

init(dateType: Int, isGlobal: Bool = true) {
self.dateType = dateType
self.isGlobal = isGlobal

self.dailyVax = [
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 6))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 6))", show: true),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 5))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 5))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 4))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 4))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 3))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 3))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 2))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 2))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 1))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 1))", show: false),
DailyVaccinations(day: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: false, dayCt: 0))", value: "(showData(tabType: isGlobal, date: dateType, dataType: 4, change: true, dayCt: 0))", show: false)
]
}

var body: some View {
...
}

}