在结构的计算属性中访问环境对象属性

Posted

技术标签:

【中文标题】在结构的计算属性中访问环境对象属性【英文标题】:Access environment object property within a struct's computed property 【发布时间】:2020-04-18 19:44:02 【问题描述】:

我目前有一个结构,它有一个名为“answerArray”的计算属性。我想将此值数组与存储在 Environment 对象中的另一个值数组进行比较。

struct CandidateModel 
@EnvironmentObject var model: CardViewModel

let index: Int
var name: String
var answers: [AnswerModel]
var answerArray: [Double] 
    get 
        var arr: [Double] = []
        for i in answers 
            if i.isKeyIssue 
            // If answer is a key issue
                arr.append(i.score * 1.5)
                // Apply multiplier and append to answer array
            
            else arr.append(i.score)
            // otherwise just append to list
        
        return arr
    

var scoreArray: [Double] 
    get 

        var compScoreArray: [Double] = []

        for i in 0...self.model.getAnswerList().count - 1 
            let questionDifference = abs(self.answerArray[i] - self.model.answerList[i])
            compScoreArray.append(questionDifference)
        

        return compScoreArray
    

我在尝试访问此属性时收到以下错误:

Thread 1: Fatal error: No ObservableObject of type CardViewModel found. A View.environmentObject(_:) for CardViewModel may be missing as an ancestor of this view.

我只是想更新 CandidateModel 中的 scoreArray 属性,因为我的环境对象中的 answerList 属性发生了变化。我怎样才能更好地实现这一点?

这是我的查看代码:

struct SentimentComparisonBarView: View 
@EnvironmentObject var model: CardViewModel

var body: some View 
    HStack 
      // 2
        Image("Jobs_Economy")
            .renderingMode(.template)
            .resizable()
            .scaledToFit()
            .frame(width: 50)
            .foregroundColor(Color.init(#colorLiteral(red: 0.3942148186, green: 0.3146163453, blue: 0.4587302703, alpha: 1)))

        Text("Jobs/Economy")
            .frame(width: 120, alignment: .leading)
          // 3
          Rectangle()
            .fill(Color.init(#colorLiteral(red: 0.5201314092, green: 0.3027745485, blue: 0.49252671, alpha: 1)))
            .frame(width: CGFloat(2 * 10.0), height: 5.0)
          // 4
          Spacer()
            Text("Low")
                .padding(.horizontal, 10)

        Button("Test") 
            print(self.model.presidentialCandidates[0].scoreArray)
        

    

【问题讨论】:

【参考方案1】:

您应该在视图中使用@EnvironmentObject 并将其传递给您的模型。并且不要忘记致电.environmentObject 将您的CardViewModel 注入SceneDelegate。例如:

let myView = MyView().environmentObject(CardViewModel())

【讨论】:

感谢您的意见!我以为我已经这样做了。我在原始问题中添加了更多 sn-ps 供您参考。 @JoshuaMartinez 很抱歉,我不明白你现在有什么问题。

以上是关于在结构的计算属性中访问环境对象属性的主要内容,如果未能解决你的问题,请参考以下文章

类的属性和继承

类的属性和继承

将计算属性嵌套在一个对象中以进行代码维护 (Vue)

Vue 计算属性改变存储状态

《从零开始学Swift》学习笔记(Day 32)——计算属性

如何在可编码结构中使用计算属性(swift)