Строковая переменная в 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
    }
}
Другие вопросы по тегам