Day 49 - Codable
NSCoding은 UserDefaults를 사용할 때 데이터를 읽고 쓸 수 있는 매우 좋은 방식이고,
Objective-C 코드와 함께하는 Swift 코드를 작성해야할 때 가장 흔히 선택된다.
그러나, 만약 Swift만을 사용한다면, Codable 프로토콜이 훨씬 사용하기 쉽ㄴ다.
NSCoding과 Codable 사이에는 세 가지 주요한 차이점이 있다.
-
Codable은 클래스와 구조체 모두에서 작동한다. NSCoding은 클래스에서만 사용 가능하기 때문에 앞에서는 Person을 클래스로 만들었었다.
-
NSCoding을 사용할 때, encode()와 init()을 작성하여 스스로를 호출해야했지만 Codable에서는 이것이 필요하지 않다.(더 정교한 제어가 필요하지 않다면)
-
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]을 반환해준다.
Author And Source
이 문제에 관하여(Day 49 - Codable), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sun02/Day-49-Codable저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)