Codable & Archive

한천희·2020년 2월 24일
0

iOS & Swift

목록 보기
4/6

archive

기록한다 보관한다 박제시킨다 영구저장소에 기록한다
내 디스크에 저장할 때도 'archive 한다' 라고 표현

인코딩 디코딩

정보를 주고 받을 때 바이너리 코드로 주고 받음. 그런데 그 자체로 쓸 수 없으니 정보를 변환해야 됨. i.g.) 서버간 통신

스위프트의 오브젝트 <-> 이진수
인코딩: 오브젝트 -> 이진수
디코딩: 오브젝트 <- 이진수

디코딩 된 정보를 파일 형태로 저장하는 것을 archiving 한다라고 표현

Codable

{key : value} 딕셔너리, 객체

합성 프로토콜. JSON 을 처리하는 것

서버간 통신을 예로 들면 서버는 json 형태의 string을 바이너리 코드로 보내줌.(인코딩)
내 컴퓨터는 바이너를 코드를 받아서 json 형태의 string으로 변환. (디코딩)

바이너리코드(이진수)를 -> 스트링으로 -> 구조체에 맞는 형태로

import UIKit
let jsonString = """
[ {"artist":"BTS", "title":"ON", "duration":180, "members":[{"name":"뷔"},{"name":"장국"}]},
{"artist":"Secret", "title":"Shining", "duration":200},
{"artist":"잔나비", "title":"뜨거운 여름밤", "duration":250} ]
"""
let jsonData: Data = jsonString.data(using: .utf8)!
struct Member: Codable {
    let name: String
}
struct Album: Codable {
    let artist: String
    let title: String
    let duration: TimeInterval
    let members: [Member]?
}
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let applicationDirectory = FileManager.default.urls(for: .documentDirectory,
            in: .userDomainMask).first!
        let filePath = applicationDirectory.appendingPathComponent("file.json")
        // 서버에서 보내준 데이터 혹은 디스크에서 불러온 데이터...
        let dataFromServer = try! Data(contentsOf: filePath)
        let decoder: JSONDecoder = JSONDecoder()
        let result: [Album]
        do {
            result = try decoder.decode([Album].self,
                                            from: jsonString)
            print(result.last!.title)
        } catch {
            fatalError(error.localizedDescription)
        }
        let encoder: JSONEncoder = JSONEncoder()
        do {
            let data: Data = try encoder.encode(result)
            // 서버로 데이터 보내거나 디스크 저장...
            FileManager.default.createFile(atPath: filePath.absoluteString,
                                           contents: data,
                                           attributes: nil)
            do {
                try data.write(to: filePath, options: .atomicWrite)
            } catch {
                fatalError(error.localizedDescription)
            }
        } catch {
            fatalError(error.localizedDescription)
        }
    }
}

0개의 댓글