環境
やりたいこと
NSKeyedArchiver
と NSKeyedUnarchiver
を使って、UserDefaultsやKeyChainに色々入れたり出したりすることがあると思います。iOS 11まではこうやって書いていました。
let rootObject: [Int] = [1, 2, 3, 4, 5]
let archivedData = NSKeyedArchiver.archivedData(withRootObject: rootObject)
UserDefaults.standard.set(archivedData, forKey: "key")
let data = UserDefaults.standard.data(forKey: "key")!
let unarchivedObject = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Int]
print(unarchivedObject)
ここで使っている archivedData(withRootObject:)
と unarchiveObject(with:)
はiOS 12以降のAPIではDeprecatedになっているので、置き換えます。
let rootObject: [Int] = [1, 2, 3, 4, 5]
let archivedData = try! NSKeyedArchiver.archivedData(withRootObject: rootObject, requiringSecureCoding: false)
UserDefaults.standard.set(archivedData, forKey: "key")
let data = UserDefaults.standard.data(forKey: "key")!
let unarchivedObject = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [Int]
print(unarchivedObject)
Xcodeからは
'unarchiveObject(with:)' was deprecated in iOS 12.0: Use +unarchivedObjectOfClass:fromData:error: instead
というWarningが出るんですが、素直に unarchivedObjectOfClass(fromData:, error:)
を使うと
let unarchivedObject = try! NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self], from: data) as? [Int]
というコードを書く必要があり(Array
じゃなくてNSArray
です)難しさが増すので unarchiveTopLevelObjectWithData()
を使うのをおすすめします。