【问题标题】:Cannot use instance member 'dateType' within property initializer; property initializers run before 'self' is available [duplicate]不能在属性初始值设定项中使用实例成员“dateType”;属性初始化程序在“self”可用之前运行[重复]
【发布时间】:2021-09-28 08:03:11
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift iphone xcode swiftui


    【解决方案1】:

    您收到此错误消息是因为您尝试在初始化程序中访问 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 {
            ...
        }
        
    }
    

    【讨论】:

    • 是的,我试过这个,它说“变量'self.dateType'在初始化之前使用”,“变量'self.isGlobal'在初始化之前使用”和“变量'self.dailyVax'使用在初始化之前”:/ 不知道该怎么做,不过感谢您的帮助
    • 这很奇怪,我最终测试了它,它似乎有效。您能否用您尝试过的内容更新您的原始问题,以便我可以尝试提供帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2021-04-03
    • 2020-06-18
    • 2020-10-24
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多