Day 49 - Codable

NSCoding은 UserDefaults를 사용할 때 데이터를 읽고 쓸 수 있는 매우 좋은 방식이고,
Objective-C 코드와 함께하는 Swift 코드를 작성해야할 때 가장 흔히 선택된다.

그러나, 만약 Swift만을 사용한다면, Codable 프로토콜이 훨씬 사용하기 쉽ㄴ다.

NSCoding과 Codable 사이에는 세 가지 주요한 차이점이 있다.

  1. Codable은 클래스와 구조체 모두에서 작동한다. NSCoding은 클래스에서만 사용 가능하기 때문에 앞에서는 Person을 클래스로 만들었었다.

  2. NSCoding을 사용할 때, encode()와 init()을 작성하여 스스로를 호출해야했지만 Codable에서는 이것이 필요하지 않다.(더 정교한 제어가 필요하지 않다면)

  3. Codable을 사용하여 데이터를 encode할 때 원한다면 NSCoding에서 사용한 같은 형식을 사용해도 되지만, 더 좋은 JSON이 있다 - Coable은 JSON을 기본적으로 읽고 쓴다.

이 모든 세 가지는 결합하면 데이터를 가질 구조체를 정의할 수 있고, Swift가 추가 작업 없이 JSON에서 직접 구조체의 인스턴스를 생성할 수 있게한다.

Person class가 Codable을 따르도록 수정해보자


class Person: NSObject, Codable {
  • 이게 끝이다!

NSCoding을 사용했을 때처럼 save() 메서드를 만들어보자


func save() {
	let jsonEncoder = JSONEncoder()
    if let savedData = try? jsonEncoder.encode(people) {
    	let defaults = UserDefaults.standard
        defaults.set(savedData, forKey: "people")
    } else {
    	print("Failed to save people.")
    }
}
  • JSONEncoder 클래스를 사용해서 people배열을 Data object로 변환하고, UserDefaults에 저장한다.

앱이 실행될 때 디스크에서 배열을 불러오기 위해 viewDidLoad()에 다음을 추가한다.


let defaults = UserDefaults.standard

if let savedPeople = defaults.object(forKey: "people") as? Data {
	let jsonDecoder = JSONDecoder()
    
    do {
    	people = try jsonDecoder.decode([Person].self, from: savedPeople)
    } catch {
    	print("Failed to load people")
    }
}
  • obejct(forKey:)를 사용해서 Data를 가져오고, if let ... as? 를 사용하여 언래핑한다.

  • JSONDecoder의 인스턴스를 사용해서 object그래프로 변환한다 (Person object배열)

  • decode() 메서드의 첫 번째 파라미터 [Person].self는 "Person object 로 구성된 배열을 만들도록 시도해라" 라는 의미이다. 이로 인해, people에 할당할 때 타입캐스팅이 필요하지 않다. - 이 메서드가 자동으로 [People]을 반환해준다.

좋은 웹페이지 즐겨찾기