环境中的字符串变量仅是get迅速

问题描述

我可以在环境中获取变量,但是无法设置/更新该变量。

我的环境对象如下:

import SwiftUI
import Combine

class UserData: ObservableObject{
    @Published var examples = exampleData
}

我有一个读取JSON的加载函数

let exampleData: [Example] = load("exampleData.json")

在这里示例格式为:

import SwiftUI
import CoreLocation

struct Example: Hashable,Codable,Identifiable {
    var id: Int
    var name: String
    var exampleCondition: [SubCondition]
}

struct SubCondition: Hashable,Identifiable {
    var id: Int
    var comparand: String
    var firstElement: ExampleElement
    var secondElement: ExampleElement
    
    var stringFormat: String {
        firstElement.stringFormat + " " + comparand + secondElement.stringFormat     
    }
}

struct ExampleElement: Hashable,Codable {
    var timeFrame: String
    var element: String
    
    var stringFormat: String {
        element + " (" + timeFrame + ")"
    }
}

在我的视图中使用@EnvironmentObject var userData: UserData,我可以显示类似Text(userData.examples[examplesIndex].exampleCondition[0].stringFormat)

但是,我得到了Cannot assign to property: 'stringFormat' is a get-only property。当我这样做时:

var tempString: String = "abc"

Rectangle().onTapGesture {
   userData.examples[examplesIndex].exampleCondition[0].stringFormat = tempString
}

如何在@EnvironmentObject var userData中设置内容

是因为正在计算stringFormat,而设置stringFormat的最佳方法是在ExampleElement中编辑用于计算stringFormat的变量?如果是这样,是否有办法设置自定义获取并设置?

解决方法

要同时拥有自定义getter和setter,您需要的只是第二个属性。

var _stringFormat: String?

stringFormat: String {
    get { 
        _stringFormat ?? element + " (" + timeFrame + ")"
    }
    set {
        _stringFormat = newValue
    }
}
,

这是一条路

var stringFormat: String {
    get {
        firstElement.stringFormat + " " + comparand + secondElement.stringFormat
    }
    set {
        // parse incoming newValue String to store back into
        // firstElement,comparand,and secondElement
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...