Skip to content

Instantly share code, notes, and snippets.

@martinr448
Created September 30, 2018 19:21
Show Gist options
  • Save martinr448/03aa3f425a636d469769020dbe3953b5 to your computer and use it in GitHub Desktop.
Save martinr448/03aa3f425a636d469769020dbe3953b5 to your computer and use it in GitHub Desktop.
import Foundation
@objcMembers class ClassA: NSObject, NSSecureCoding {
var title: String
init(title: String) {
self.title = title
}
func encode(with aCoder: NSCoder) {
aCoder.encode(self.title, forKey: "title")
}
required init?(coder aDecoder: NSCoder) {
guard let title = aDecoder.decodeObject(of: NSString.self, forKey: "title") as String? else {
return nil
}
self.title = title
}
public class var supportsSecureCoding: Bool { return true }
}
@objcMembers class ClassB: ClassA {
var name: String
init(name: String, title: String) {
self.name = name
super.init(title: title)
}
override func encode(with aCoder: NSCoder) {
aCoder.encode(self.name, forKey: "name")
super.encode(with: aCoder)
}
required init?(coder aDecoder: NSCoder) {
guard let name = aDecoder.decodeObject(of: NSString.self, forKey: "name") as String? else {
return nil
}
self.name = name
super.init(coder: aDecoder)
}
//override public class var supportsSecureCoding: Bool { return true }
static private var secureCoding = true
override public class var supportsSecureCoding: Bool { return secureCoding }
}
do {
let obj = ClassB(name: "NAME", title: "TITLE")
let data = NSKeyedArchiver.archivedData(withRootObject: obj)
let ua = NSKeyedUnarchiver(forReadingWith: data)
ua.requiresSecureCoding = true
if let other = ua.decodeObject(of: ClassB.self, forKey: NSKeyedArchiveRootObjectKey) {
print(other.name, other.title)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment