Last active
September 4, 2015 00:15
-
-
Save timfuqua/868a2747fd7a481ab48e to your computer and use it in GitHub Desktop.
Sample project for answering SO question: http://stackoverflow.com/questions/32359455/approach-to-encoding-decoding-nontrivial-property-of-a-class-in-swift
This file contains 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 | |
class ConfigurationOption: NSObject, NSCoding { | |
var configurations: [String] = [] | |
var name: String = "" | |
// NSCoding | |
required convenience init(coder decoder: NSCoder) { | |
self.init() | |
decodeConfigurations(coder: decoder) | |
decodeName(coder: decoder) | |
} | |
override init() { | |
configurations = [] | |
name = "" | |
} | |
// NSCoding | |
func encodeWithCoder(coder: NSCoder) { | |
coder.encodeObject(configurations, forKey: "configurations") | |
coder.encodeObject(name, forKey: "name") | |
} | |
init(configurations: [String], name: String) { | |
self.configurations = configurations | |
self.name = name | |
} | |
func getConfigurationOptionAsData() -> NSData { | |
return NSKeyedArchiver.archivedDataWithRootObject(self) | |
} | |
private func decodeConfigurations(coder decoder: NSCoder) { | |
configurations = (decoder.decodeObjectForKey("configurations") as! [String]?) ?? [] | |
} | |
private func decodeName(coder decoder: NSCoder) { | |
name = (decoder.decodeObjectForKey("name") as! String?) ?? "" | |
} | |
} | |
class ViewController: UIViewController { | |
var configurationOptions: [ConfigurationOption]? = nil | |
override func viewDidLoad() { | |
println("\nviewDidLoad") | |
super.viewDidLoad() | |
// MARK: Uncomment these lines to remove the configuration options stored in NSUserDefaults | |
// println("Remove the configuration options from NSUserDefaults") | |
// NSUserDefaults.standardUserDefaults().removeObjectForKey("configurationOptions") | |
println("Attempting to load configuration options from NSUserDefaults") | |
if let dataArray = NSUserDefaults.standardUserDefaults().objectForKey("configurationOptions") as? [NSData] { | |
println("Configuration options found in NSUserDefaults") | |
configurationOptions = [] | |
for data in dataArray { | |
if let configurationOption = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? ConfigurationOption { | |
println("ConfigurationOption loaded!") | |
configurationOptions!.append(configurationOption) | |
} | |
} | |
println("Finished loading configuration options from NSUserDefaults") | |
} | |
else { | |
println("No configuration options found") | |
} | |
printConfigurationOptions() | |
} | |
override func viewDidAppear(animated: Bool) { | |
println("\nviewDidAppear") | |
super.viewDidAppear(animated) | |
archiveSomeConfigurationOptions() | |
printConfigurationOptions() | |
} | |
func printConfigurationOptions() { | |
println("\nPrinting configuration options") | |
if configurationOptions == nil { | |
println("No configuration options yet.") | |
return | |
} | |
for configurationOption in configurationOptions! { | |
print("configurationOption.configurations: [ ") | |
for configuration in configurationOption.configurations { | |
print("\(configuration) ") | |
} | |
println("]") | |
println("configurationOption.name: \(configurationOption.name)") | |
} | |
} | |
func archiveSomeConfigurationOptions() { | |
if configurationOptions == nil { | |
println("\nArchiving some sample configuration options") | |
configurationOptions = [] | |
configurationOptions!.append(ConfigurationOption(configurations: ["config1", "config2"], name: "2 configuration options")) | |
configurationOptions!.append(ConfigurationOption(configurations: ["config1", "config2", "config3"], name: "3 configuration options")) | |
NSUserDefaults.standardUserDefaults().setObject(map(configurationOptions!, { return $0.getConfigurationOptionAsData() } ), forKey: "configurationOptions") | |
} | |
else { | |
println("\nSome configuration options are already stored. Not storing anything this time.") | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment