2017-11-02 14 views
0

나는 내 JSON을 쉽게 직렬화하기위한 확장 메서드를 작성하고 싶습니다. 다음 클래스가 있습니다.모델 확장으로 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는 새로운 기능을 제공합니다. 프로토콜을 호출합니다. 클래스를 직렬화 할 수있게하려면 클래스에서이 프로토콜을 채택하면됩니다. 이처럼 : 모든 속성 스위프트 표준 라이브러리에서 있습니다

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

때문에, 클래스는 JSONEncoder 유형으로 직렬화 할 준비가되어 있습니다.

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

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

과 같이 디코딩 게다가, 당신의 모델이 클래스 일 필요가 없다면, 그것을 구조체로 만드십시오. 구조체는 인스턴스화하기 위해 계산을 덜 사용하며 Value Type Oriented Programming입니다.

자세한 내용은 Swift Documentation을 참조하십시오.

+0

답변 해 주셔서 감사합니다. 나는 그것을 시도 할 것이지만, 나는 Realm을 사용하고있다. 그래서 초기화 자나 기본값을 사용해야한다. – TheValyreanGroup

+0

간단한 메모. structs는 많은 경우에 좋은 생각이지만 Realm 모델 유형은 클래스 여야합니다. – AustinZ