首页 > 解决方案 > 将变量的值从视图发送到类 - SwiftUI

问题描述

我想要做的是将变量的值从视图发送到类,但我不断收到错误消息。不知道该怎么办。

这是课程:

class perfCalcDep: ObservableObject {
     
    var tom:Double
    var arm:Double
    
    @Published var tempDep:String = ""
    @Published var elevDep:String = ""
    @Published var qnhDep:String = ""
    @Published var windDep:String = ""
    @Published var slopeDep:String = ""
    @Published var rwyCondDep = 0
    
    var altDep: Double {
        let pressCalc = (1013 - (Double(qnhDep) ?? 1013)) * 30
        return (Double(elevDep) ?? 0) + pressCalc
    }
    
    var altVar : Double { 0.21 * altDep }
    var tempVar : Double { 24 * (Double(tempDep) ?? 0) }
    var windVar : Double { 20.67 * (Double(windDep) ?? 0) }
    var tomVar : Double { 2.22 * Double(2550-Double(tom)) }
    var slpVar : Double { (Double(slopeDep) ?? 0) / 2 }
    
    var tod : Double { (1700 + altVar + tempVar - tomVar - windVar) }
    var todr : Double {
        if rwyCondDep == 1 {
            return (tod + ((0.1 * tod) * slpVar)) * 1.2
        } else if rwyCondDep == 2 {
            return (tod + ((0.1 * tod) * slpVar)) * 1.3
        } else {
            return (tod + ((0.1 * tod) * slpVar))
        }
    }
    
    init(tom:Double, arm:Double) {
        self.tom = tom
        self.arm = arm
    }
}

这是视图的一部分:

struct TakeOffPerf: View {
    
// The variables I want to send to the class - their values are received from the previous view.
    var tMss:Double
    var tArm:Double
    
    @ObservedObject var performance = perfCalcDep(tom: tMss, arm: tArm) // Error: Cannot use instance member 'tArm' within property initializer; property initializers run before 'self' is available
    @ObservedObject var settings = Settings()

    var body: some View {,,,} // just a list that shows the values from the class

任何帮助将不胜感激。

标签: swiftui

解决方案


属性在 之前初始化self,因此您不能在属性之间进行初始化依赖,但您可以在 中执行此操作init,例如。

struct TakeOffPerf: View {
    
    var tMss:Double
    var tArm:Double
    
    @ObservedObject var performance: perfCalcDep  // << only declare !!
    @ObservedObject var settings = Settings()

    init(tMss:Double, tArm:Double) {
       self.tArm = tArm
       self.tMss = tMss
       self.performance = perfCalcDep(tom: tMss, arm: tArm)
    }

// ... other code
}

注意:保留原始样式,但最好将类型命名为大写,例如PerfCalcDep


推荐阅读