[iOS] Codable

RudinP·2025년 6월 7일
0

Study

목록 보기
276/292

  • 프로토콜이 아닌 typeAlias지만 그냥 편의상 프로토콜이라고 부른다.
  • 구조체와 클래스를 모두 지원한다.

  • NSCoding과 다르게 Decodable과 Encodable은 기본 구현 생성자를 사용해도 된다.
  • 따라서 코드가 단순해진다.
  • Codable은 jsonParsing을 하는데 자주 사용된다.

구현

1) Codable 채택하는 구조체 생성

//Codable은 기본 구현된 생성자가 있으므로 멤버 구현 생략 가능
struct Language: Codable {
	let name: String
    let version: Double
    let logo: Data
}

2) encode구현

  • 마찬가지로 NSKeyedArchiver 사용
  • 인스턴스 멤버를 이용해서 인코딩 시 모든 작업 끝낸 뒤 finishEncoding 호출 필수
class ViewController: UIViewController {
	...
    func encodeObject() {
    	do {
        	guard let img = UIImage(named: "swift")?.pngData() else { return }
        	
            let obj = Language(name: "Swift", version: 5.9, logo: img)
            
            let archiver = NSKeyedArchiver(requiringSecureCoding: true)
            try archiver.encodeEncodable(obj, forKey: NSKeyedArchiveRootObjectKey) // NSKeyedArchiver에 저장되며, encodedData
            try archiver.encodedData.write(to: fileUrl, options:.atomic)
            
            //중요. 인스턴스 멤버를 이용해서 인코딩 시 필수
            //모든 작업 끝낸 뒤 
            archiver.finishEncoding()
        } catch {
        	print(error)
        }
    }
...
}

3) decode 구현

  • 마찬가지로 NSKeyedUnarchiver 사용
  • 인스턴스 멤버를 이용해서 디코딩 시 모든 작업 끝낸 뒤 finishDecoding 호출 필수
class ViewController: UIViewController {
	...
    func decodeObject() {
    	do {
        	let data = try Data(contentsOf: fileUrl)
            
            let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
            unarchiver.requresSecureCoding = true
            
            if let language = unarchiver.decodeDecodable( Language.self, forKey: NSKeyedRootObjectKey) {
            	logoImageView.image = UIImage(data: language.logo)
                nameLabel.text = language.name
                versionLable.text = "\(language.version)"
            	
                unarchiver.finishDecoding()
            }
        } catch {
        	print(error)
        }
    }
}
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글