2017-11-02 11 views
0

私はJSONを簡単にシリアル化するための拡張メソッドを書いておきたい次のクラスを持っています。Model extensionへのJSON

class Evaluation: Object { 
    var name: String? 
    var isFinalized: Bool? 
    var id: Int? 
    var idString: String? { 
     get{ 
      return String(describing:self.id!) 
     } 
    } 

    convenience init(json: JSON?) { 
     self.init() 
     if let json = json { 
      name = json["evaluationDescription"].rawString() 
      isFinalized = json["evaluationFinalized"].intValue == 0 ? false : true 
      id = json["evaluationID"].intValue 
     } 
    } 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

これは私が書いた拡張ですが、これは変異があり、よりグローバルに使用できるようにしたいと思います。だから私はすべての私のモデルのために同じコードを使用することができます。

extension Evaluation { 
    func serialize(from json: JSON){ 
     var temp = [Evaluation]() 
     for (_,j): (String,JSON) in json { 
      temp.append(Evaluation(json: j)) 
     } 
    } 
} 

私は方法mutatingを作ってみましたが、エラー

クラスのメソッドには有効ではありません '変異' を持って...要するに

、私が欲しいです(jsonはやや擬似コードです)...

var json = "{'name':'test','isFinalized','0','id':'532'}" 

var evaluations = [Evaluations]() 
evaluations.serialize(from: json) 

答えて

2

Swift 4は新しいCodableと呼ばれるプロトコルです。クラスをシリアライズ可能にするには、このプロトコルをクラスで採用する必要があります。このように:すべてのあなたの特性は、スウィフト標準ライブラリからです

class Evaluation: Object, Codable { 
    var name: String? 
    var isFinalized: Bool? 
    var id: Int? 
    var idString: String? { 
     get{ 
      return String(describing:self.id!) 
     } 
    } 
} 

ので、あなたのクラスはJSONEncoderタイプでシリアライズする準備ができています。

let evaluation = Evaluation() 
let encoded = try? JSONEncoder().encode(evaluation) 

と、次のようにデコード:

let decoded = try? JSONDecoder().decode(Evaluation.self, encoded) 

をこのプロトコルは自動的にあなたのクラスが直列化可能になりますので、それはこのようにすることができますので、あなたは、初期化子ことを必要としません:

class Evaluation: Object, Codable { 
    var name: String 
    var isFinalized: Bool 
    var id: Int 
    var idString: String { 
     get{ 
      return String(describing:self.id!) 
     } 
    } 
} 

さらに、モデルがクラスである必要がない場合は、それを構造体にします。構造体は、より少ない計算を使用してインスタンス化され、より多くはValue Type Oriented Programmingです。

この詳細については、Swift Documentationをご覧ください。

+0

お返事ありがとうございます。私はそれを試してみましょう、しかし、私はRealmを使用しているので、私はイニシャライザまたはデフォルト値を使用する必要があります。 – TheValyreanGroup

+0

ちょっとした注意。多くの場合、構造体は良いアイデアですが、Realmモデルの型はクラスでなければなりません。 – AustinZ

関連する問題