LoginSignup
5
5

More than 5 years have passed since last update.

[Swift] enumをキーにしてNSKeyedArchiverで保存する

Last updated at Posted at 2016-02-08

目的

NSKeyedArchiver / NSKeyedUnarchiver でデータを保存する際のキーをenumで管理するため。
Protocolつけるだけで利用できるようにしたい。

使い方

// 保存先のパス指定
private let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] + "/foo.cache"

// enumの定義
enum Key: String, EnumKeyedArchivable {
    case Bar = "Bar"
}

// Archive
var dictionary: [Key: AnyObject] = [:]
dictionary[.Bar] = "This is Bar"
NSKeyedArchiver.archive(dictionary, toFile: path)

// Unarchive
let unarchivedDictionary = NSKeyedUnarchiver.unarchive(Key.self, file: path)
print(unarchivedDictionary)  // Optional([Key.Bar: This is Bar])

実装

protocol EnumKeyedArchivable: RawRepresentable {
    func keyValue() -> String
    init?(stringValue: String)
}

extension EnumKeyedArchivable where Self: RawRepresentable, Self.RawValue == String {
    func keyValue() -> String {
        return self.rawValue
    }
    init?(stringValue: String) {
        self.init(rawValue: stringValue)
    }
}

extension NSKeyedArchiver {
    class func archive<T: EnumKeyedArchivable>(dictionary: [T: AnyObject], toFile file: String) {
        var archivableDictionary: [String: AnyObject] = [:]
        for (key, value) in dictionary {
            archivableDictionary[key.keyValue()] = value
        }
        self.archiveRootObject(archivableDictionary, toFile: file)
    }
}

extension NSKeyedUnarchiver {
    class func unarchive<T: EnumKeyedArchivable>(key: T.Type, file: String) -> [T: AnyObject]? {
        guard let archivedDictionary = self.unarchiveObjectWithFile(file) as? [String: AnyObject] else {
            return nil
        }
        var dictonary: [T: AnyObject] = [:]
        for (key, value) in archivedDictionary {
            if let enumKey = T(stringValue: key) {
                dictonary[enumKey] = value
            }
        }
        return dictonary
    }
}
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5