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

时间:2021-07-20 20:45:39

标签: ios swift iphone xcode swiftui

我对 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)
                        }
                        
                    } ...

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

1 个答案:

答案 0 :(得分:0)

您收到此错误消息是因为您正在尝试访问初始化程序内部的 isGlobaldateType

当尚未定义所有值时,您无法执行此操作,因此错误消息中会出现“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 {
        ...
    }
    
}