環境内で変数を取得できますが、変数を設定/更新できません。
私の環境オブジェクトは次のようになります:
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)
ただし、「プロパティに割り当てられません: 'stringFormat' は取得専用のプロパティです」というメッセージが表示されます。その場合:
var tempString: String = "abc"
Rectangle().onTapGesture {
userData.examples[examplesIndex].exampleCondition[0].stringFormat = tempString
}
@EnvironmentObject var userData 内に何かを設定するにはどうすればよいですか?
stringFormat を計算しているためでしょうか。stringFormat を設定する最良の方法は E の変数を編集することです。stringFormat を計算するために使用する xampleElement?その場合、カスタムの get および set を設定する方法はありますか?
stringFormat は計算プロパティであるため、このエラーが発生します。
– ヨウジン
2020 年 9 月 4 日 22:44
@youjin 計算しても stringFormat を設定できる方法はありますか?
– ルイ・イェ
2020 年 9 月 4 日 22:56
代わりに timeFrame と要素のプロパティを設定することはできませんか?それが最も簡単なアプローチです。
– ヨウジン
2020 年 9 月 4 日 23:04
@youjin はい。それを試してみましたが、代わりにカスタムの set 関数を使用できるかどうか疑問に思っていました。
– ルイ・イェ
2020 年 9 月 4 日 23:05
------------------------
これがその方法です
var stringFormat: String {
get {
firstElement.stringFormat + " " + comparand + secondElement.stringFormat
}
set {
// parse incoming newValue String to store back into
// firstElement, comparand, and secondElement
}
}
------------------------
カスタムのゲッターとセッターの両方を使用するには、2 番目のプロパティだけが必要です。
var _stringFormat: String?
stringFormat: String {
get {
_stringFormat ?? element + " (" + timeFrame + ")"
}
set {
_stringFormat = newValue
}
}