swiftui - 環境内の文字列変数は取得のみです。迅速

okwaves2024-01-25  6

環境内で変数を取得できますが、変数を設定/更新できません。

私の環境オブジェクトは次のようになります:

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
    }
}

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。