我对 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 { ...
这是 [DailyVaccinations] 结构:
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)
}
} ...
如果有人能帮我解决这个问题,将不胜感激!谢谢
答案 0 :(得分:0)
您收到此错误消息是因为您正在尝试访问初始化程序内部的 isGlobal
和 dateType
。
当尚未定义所有值时,您无法执行此操作,因此错误消息中会出现“before self is available”。
要解决此问题,请编写自定义初始化程序:
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 也很陌生,但这是我对它的理解。有关初始化程序如何工作以及它们可以做什么的更多信息,我建议在 Google 上搜索有关该主题的更多信息和/或访问官方 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 {
...
}
}