2017-02-09 4 views
1

UIバックグラウンドの管理を扱うシンプルな構造体を作成しました(ユーザーはグラデーションまたはイメージの使用を選択できます)。この構造体の内部にはpreferenceという計算されたプロパティがあり、ユーザーのプリファレンスを取得してUserDefaultsに設定します。計算された値を設定する(struct vs class)

私はにしようと、次のコードを使用preferenceプロパティ設定:

Background().preference = .gradient

を私はエラーを取得: "プロパティに割り当てることができません:関数呼び出しは、不変の値を返す"

Iこれを代わりに使用する必要があります。

​​

最後にプロパティを設定する前に、Backgroundのインスタンスを変数に代入する必要はありません。

私はclassstructから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") 
     } 
    } 
} 
+1

'Background()'を呼び出すたびに、 'UserDefault'値へのアクセス/設定の唯一の(一時的な)使用のために新しい' Background'インスタンスが作成されます。つまり、何かを格納しない値の型を持っていて、特定の 'UserDefault'へのアクセスインタフェースのみを提供しています。おそらく、ここでシングルトンや純粋な型のプロパティ/メソッド( 'preference'を置き換える)を使うのが好きでしょうか? ( 'Background'をクラスにすると同じ問題が残ることに注意してください:データ自体を所有していないインスタンスをオンザフライで構築すること) – dfri

答えて

1

struct/classのインスタンスをUserDefaultsをラップするだけの価値はありません。それは非常に一般的な問題であり、あなたが周りを検索する場合、グーグル上に巧妙なソリューションがたくさんあります。本当に簡単たとえば、あなただけのUserDefaults

//: Playground - noun: a place where people can play 

import Cocoa 


enum BackgroundChoice { 
    case gradient 
    case image 
} 

extension UserDefaults { 

    var backgroundChoice: BackgroundChoice { 
     get { 
      if let type = string(forKey: "background_type"), type == "image" { 
       return .image 
      } 
      return .gradient 
     } 

     set(value){ 
      if value == .image { 
       setValue("background", forKey: "background_type") 
      }else{ 
       setValue("gradient", forKey: "background_type") 
      } 
     } 
    } 

} 

UserDefaults.standard.backgroundChoice = .image 

を拡張することができ、私は、これはあなたの正確な質問に答えていないけど、私はあなたがあなたの周りに掘る場合は、この問題に対するより良い解決策がある見つけることだと思います。

+1

私の目標は、このタイプのコードをビューコントローラから別々に移動することでしたファイルのサイズを縮小し、テスト容易性を向上させます。拡張機能は、その点で本当に役に立ちます。ありがとう。 – Ryan

関連する問題