Skip to content

Instantly share code, notes, and snippets.

@jorgenisaksson
Created April 1, 2017 13:22
Show Gist options
  • Save jorgenisaksson/6bc71e7a2186712e34303b9866a99ab3 to your computer and use it in GitHub Desktop.
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!
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