기록한다 보관한다 박제시킨다 영구저장소에 기록한다
내 디스크에 저장할 때도 'archive 한다' 라고 표현
정보를 주고 받을 때 바이너리 코드로 주고 받음. 그런데 그 자체로 쓸 수 없으니 정보를 변환해야 됨. i.g.) 서버간 통신
스위프트의 오브젝트 <-> 이진수
인코딩: 오브젝트 -> 이진수
디코딩: 오브젝트 <- 이진수
디코딩 된 정보를 파일 형태로 저장하는 것을 archiving 한다라고 표현
{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)
}
}
}