1) NSObject, NSCoding 프로토콜을 채택하는 모델 생성
class Language: NSObject, NSCoding {
let name: String
let version: Double
let logo: UIImage
init(name: String, version: Double, logo: UIImage) {
self.name= name
self.version = version
self.logo = logo
}
}
2) 필수 메소드 작성
encode
: 파라미터로 전달되는 coder 객체로 encode 하는 코드 구현생성자
: decode 코드 구현class Language: NSObject, NSCoding {
let name: String
let version: Double
let logo: UIImage
//필수 메소드
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(version, forKey: "version")
coder.encode(logo, forKey: "logo")
}
//필수 메소드
required init?(coder: NSCoder) {
guard let nameValue = coder.decodeObject(forKey: "name") as? String else { return nil }
name = nameValue
version = coder.decodeDouble(forKey: "version")
guard let img = coder.decodeObject(forKey: "logo") as? UIImage else { return nil }
logo = img
}
init(name: String, version: Double, logo: UIImage) {
self.name= name
self.version = version
self.logo = logo
}
}
3) 해당 모델을 저장, 사용하는 클래스에서 encode, decode 사용
NSKeyedArchiver
과 NSKeyedUnarchiver
사용
Archiver
로 전달하는 오브젝트는 반드시 NSObject
를 상속해야 한다.NSCoding
을 구현해야 한다. 그렇지 않으면 크래시 발생class ViewController: UIViewController {
...
func encodeObject() {
do {
guard let img = UIImage(named: "swift") else { return }
let obj = Language(name: "Swift", version: 5.9, logo: img)
//바이너리데이터 리턴
let data = try NSKeyedArchiver.archivedData(withRootObject:obj, requiringSecureCoding: false)
try data.write(to: fileUrl, options: .atomic)
} catch {
print(error)
}
}
func decodeObject() {
do {
let data = try Data(contentsOf: fileUrl)
//객체로 decode
if let language = NSKeyedUnarchiver.unarchivedObject(with: data) as? Language {
logoImageView.image = language.logo
nameLabel.text = language.name
versionLable.text = "\(language.version)"
}
} catch {
print(error)
}
}
}