여기 객체가 NSCoding
을 준수 할 수 있도록하는 방법을 예입니다. 기본적으로 당신은 두 가지 방법의 구현을 제공 할 필요가 - required convenience init?(coder decoder: NSCoder)
및
class Book: NSObject, NSCoding {
var title: String?
var pageCount: Int?
// Memberwise initializer
init(title: String,pageCount: Int) {
self.title = title
self.pageCount = pageCount
}
// MARK: NSCoding
// Here you will try to initialize an object from archve using keys you did set in `encode` method.
required convenience init?(coder decoder: NSCoder) {
guard let title = decoder.decodeObject(forKey: "title") as? String else { return nil }
self.init(title: title, pageCount: decoder.decodeInteger(forKey: "pageCount"))
}
// Here you need to set properties to specific keys in archive
func encode(with aCoder: NSCoder) {
aCoder.encode(self.title, forKey: "title")
aCoder.encodeCInt(Int32(self.pageCount), forKey: "pageCount")
}
}
encode(with aCoder: NSCoder)
는 또한 나는이에 setCustomObject
방법을 변경하는 것이 좋습니다 :
컴파일러는 당신이하지 않는 객체를
NSKeyedArchiver
통과 방지
func setCustomObject(obj:NSCoding, key:String) {
let encodedObject : Data = NSKeyedArchiver.archivedData(withRootObject: obj)
UserDefaults.standard.set(encodedObject, forKey: key)
}
이 방법 NSCoding
프로토콜을 준수하십시오.
당신이 기본값을 사용할 수 init
방법의 모든 속성을 제공하지 않으려면
:
init(title : String? = nil, pageCount: Int? = nil){
self.title = title
self.pageCount = pageCount
}
지금 당신은 어떤 특성없이 개체를 init을 할 수 있습니다. 여기에 Book()
해야 할 것 당신의'CustomObject'가'NSCoding' 프로토콜을 준수합니까? – njuri
@ njuri가 필요하지 않습니다. –
예, 답변에 설명되어 있습니다. – njuri