UIバックグラウンドの管理を扱うシンプルな構造体を作成しました(ユーザーはグラデーションまたはイメージの使用を選択できます)。この構造体の内部にはpreference
という計算されたプロパティがあり、ユーザーのプリファレンスを取得してUserDefaultsに設定します。計算された値を設定する(struct vs class)
私はにしようと、次のコードを使用preference
プロパティ設定:
Background().preference = .gradient
を私はエラーを取得: "プロパティに割り当てることができません:関数呼び出しは、不変の値を返す"
Iこれを代わりに使用する必要があります。
最後にプロパティを設定する前に、Background
のインスタンスを変数に代入する必要はありません。
私はclass
にstruct
からBackground
を変更すると、私は直接Background().preference = .gradient
を使用してプロパティを設定することを可能にすることを発見しました。
これはなぜ起こるのか、誰かに私にいくつかの洞察を与えることができますか?この状況でstruct
を使用するよりもclass
を使用していますか、それとも問題ありませんか?
struct Background {
enum Choice {
case gradient
case image
}
var preference: Choice {
get {
if let type = UserDefaults.standard.value(forKey: "background_type"), type as! String == "background" {
return .image
}
return .gradient
}
set(value){
if value == .image {
UserDefaults.standard.setValue("background", forKey: "background_type")
}else{
UserDefaults.standard.setValue("gradient", forKey: "background_type")
}
}
}
'Background()'を呼び出すたびに、 'UserDefault'値へのアクセス/設定の唯一の(一時的な)使用のために新しい' Background'インスタンスが作成されます。つまり、何かを格納しない値の型を持っていて、特定の 'UserDefault'へのアクセスインタフェースのみを提供しています。おそらく、ここでシングルトンや純粋な型のプロパティ/メソッド( 'preference'を置き換える)を使うのが好きでしょうか? ( 'Background'をクラスにすると同じ問題が残ることに注意してください:データ自体を所有していないインスタンスをオンザフライで構築すること) – dfri