swift4에서 사용자 정의 객체를 NSUserDefaults에 저장하고 읽습니다.

9508 단어 SwiftSwift4

환경


Xcode Version 10.0 (10A255)
Apple Swift version 4.2

소개



이런 커스텀 클래스가 있었다고 해서, 이것을 NSUserDefaults 에 보존할 수 있도록(듯이) 합니다.

Task.swift
import Foundation

class Task: NSObject {

    let text: String
    let deadline: Date

    init(text: String, deadline: Date) {
        self.text = text
        self.deadline = deadline
    }

    init(from dictionary: [String: Any]) {
        self.text = dictionary["text"] as! String
        self.deadline = dictionary["deadline"] as! Date
    }
}

구현



맞춤 클래스 수정


NSCoding 프로토콜을 준수하도록 메서드를 추가합니다.

Task.swift
import Foundation

class Task: NSObject, NSCoding {

    let text: String
    let deadline: Date

    init(text: String, deadline: Date) {
        self.text = text
        self.deadline = deadline
    }

    init(from dictionary: [String: Any]) {
        self.text = dictionary["text"] as! String
        self.deadline = dictionary["deadline"] as! Date
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(text, forKey: "text")
        aCoder.encode(deadline, forKey: "deadline")
    }

    required init?(coder aDecoder: NSCoder) {
        text = aDecoder.decodeObject(forKey: "text") as! String
        deadline = aDecoder.decodeObject(forKey: "deadline") as! Date
    }
}

NSUserDefaults에서 로드


var tasks: [Task]!
let userDefaults = UserDefaults.standard
let taskData = userDefaults.object(forKey: "tasks") as? Data
guard let t = taskData else { return }
let unArchiveData = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(t)
tasks = unArchiveData as? [Task] ?? [Task]()

NSUserDefaults에 저장


let encodedTask = try? NSKeyedArchiver.archivedData(withRootObject: tasks, requiringSecureCoding: false)
let userDefaults = UserDefaults.standard
userDefaults.set(encodedTask, forKey: "tasks")
userDefaults.synchronize()

이상

다음은 NSSecureCoding의 패턴을 구현하고 기사에 정리하려고합니다

좋은 웹페이지 즐겨찾기