2017-08-10 6 views
1

コーディング可能なプロトコルを使用して私の最初のステップを実行しており、構造体をカスタムゲッターと混合しようとするとビルドエラーが発生します。どうすればこの問題を解決できますか?カスタムデコードとエンコード関数を記述する必要がありますか?コーディング可能なカスタムゲッタービルドエラー

struct MyStruct: Codable { 
    var variable: String? { 
    get { return variable?.lowercased() } 
    } 

    private enum CodingKeys: String, CodingKey { 
    case variable = "variable1" 
    } 
} 

enter image description here

UPDATE:回避策

が、私は '実際の' データを保持するプライベート変数を導入することで、最適ではないですが、それは仕事をしていません1つの回避策を見つけた:

struct MyStruct: Codable { 
    private var _variable: String? 
    var variable: String? { 
    get { return _variable?.lowercased() } 
    } 

    private enum CodingKeys: String, CodingKey { 
    case _variable = "variable1" 
    } 
} 

答えて

0

この「回避策」を使用する理由は、計算されたプロパティがsデータを捨てる。ドキュメントによると、 "...実際には値を格納せず、ゲッターとオプションのセッターを用意して、他のプロパティと値を間接的に取得して設定します。" - The Swift Programming Language

計算されたプロパティは値を格納するためのものではありません。しかし、あなたができることは、格納されたプロパティを使用して、didSetを使用して、設定時に変更することです。これには、効率が上がるという利点があります。アクセスされるたびに設定されるのではなく、設定されたときに一度だけ小文字にします。

struct MyStruct: Codable { 
    var variable: String? { 
    didSet { 
     variable = variable?.lowercased() 
    } 
    } 
} 
+0

説明していただきありがとうございます! – 3vangelos

+0

:)喜んで助けてください –

関連する問題