Строковая переменная в Environment - это только получение. Swift
Я могу получить переменную в своей среде, но не могу установить / обновить переменную.
Мой объект среды выглядит так:
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, Codable, 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? Если да, то есть ли способ настроить пользовательское получение и установку?
2 ответа
Вот способ пойти
var stringFormat: String {
get {
firstElement.stringFormat + " " + comparand + secondElement.stringFormat
}
set {
// parse incoming newValue String to store back into
// firstElement, comparand, and secondElement
}
}
Чтобы иметь и собственные методы получения и установки, все, что вам нужно, - это второе свойство.
var _stringFormat: String?
stringFormat: String {
get {
_stringFormat ?? element + " (" + timeFrame + ")"
}
set {
_stringFormat = newValue
}
}