Created
April 1, 2017 13:22
-
-
Save jorgenisaksson/6bc71e7a2186712e34303b9866a99ab3 to your computer and use it in GitHub Desktop.
NSCoding support for Swift Structs. Save and load your Swift Structs from disk!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
public struct PersonItem | |
{ | |
var title: String | |
init(title: String) { | |
self.title = title | |
} | |
} | |
extension PersonItem | |
{ | |
class Adapter: NSObject, NSCoding | |
{ | |
let personItem: PersonItem | |
init(personItem: PersonItem) | |
{ | |
self.personItem = personItem | |
super.init() | |
} | |
// PersonItem.Adapter supports encoding, decoding | |
required init?(coder aDecoder: NSCoder) | |
{ | |
guard let title = aDecoder.decodeObject(forKey: "title") as? String else { return nil } | |
personItem = PersonItem(title: title) | |
super.init() | |
} | |
public func encode(with aCoder: NSCoder) | |
{ | |
aCoder.encode(personItem.title, forKey: "title") | |
} | |
} | |
// class methods | |
static func save(personItemsArray: [PersonItem], to url: URL) -> Bool | |
{ | |
let personObjects = personItemsArray.map{Adapter(personItem: $0)} | |
return NSKeyedArchiver.archiveRootObject(personObjects, toFile: url.path) | |
} | |
static func load(from url: URL) -> [PersonItem]? | |
{ | |
let result = NSKeyedUnarchiver.unarchiveObject(withFile: url.path) | |
return (result as? [Adapter])?.map{$0.personItem} | |
} | |
} | |
let person1 = PersonItem(title: "Bob") | |
let person2 = PersonItem(title: "Nils") | |
let persons = [person1, person2] | |
let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! | |
let personCacheUrl = documentsUrl.appendingPathComponent("persons.archive") | |
let success = PersonItem.save(personItemsArray: persons, to: personCacheUrl) | |
let personsFromDisk = PersonItem.load(from: personCacheUrl) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment