我具有自定义类型的枚举数组,我想使用swift4将其存储在UserDefaults中。
enum DataType : Int
{
case cloud = 1, files = 2, googleDrive = 3, mega = 4, others = 5
}
//
let arrayOfData : [DataType] = [.cloud, .files, .mega]
我想将此数组存储在UserDefaults中。
答案 0 :(得分:3)
使DataType
符合Codable
。非常简单,只需添加Codable
enum DataType : Int, Codable
{
case cloud = 1, files, googleDrive, mega, others // the consecutive raw values are inferred
}
let arrayOfData : [DataType] = [.cloud, .files, .mega]
现在将数组编码为JSON数据并保存
let data = try! JSONEncoder().encode(arrayOfData)
UserDefaults.standard.set(data, forKey: "dataType")
然后相应地读回
do {
if let data = UserDefaults.standard.data(forKey: "dataType") {
let array = try JSONDecoder().decode([DataType].self, from: data)
}
} catch { print(error)}
答案 1 :(得分:0)
您可以将数组存储在UserDefaults
中,如下所示:
UserDefaults.standard.set(arrayOfData, forKey: "YourKeyName")
希望这会有所帮助。
答案 2 :(得分:0)
存储DataType
的rawValues。然后,从UserDefaults
检索数组时,将值映射到DataType
enum DataType: Int {
case cloud = 1
case files = 2
case googleDrive = 3
case mega = 4
case others = 5
}
let arrayOfData: [DataType] = [.cloud, .files, .mega]
let arrayKey = "enumArray"
UserDefaults.standard.set(arrayOfData.map { $0.rawValue }, forKey: "enumArray")
let rawArray = UserDefaults.standard.value(forKey: arrayKey) as! [Int]
let dataTypeArray = rawArray.compactMap { DataType(rawValue: $0) }
答案 3 :(得分:-1)
您可以使用NSKeyedArchiver存储此类自定义数据-
let encodedData = NSKeyedArchiver.archivedData(withRootObject: arrayOfData)
UserDefaults.standard.set(encodedData, forKey: "YourKeyName")
要检索数据-
if let data = UserDefaults.standard.object(forKey: "YourKeyName") as? Data{
if let decodedArray = NSKeyedUnarchiver.unarchiveObject(with: data) as? [DataType]{
//use retrieved data
}
}
答案 4 :(得分:-1)
首先将您的DataType
转换为rawValue
。
enum DataType : Int
{
case cloud = 1, files = 2, googleDrive = 3, mega = 4, others = 5
}
//
let arrayOfData:[DataType] = [.cloud, .files, .mega]
let rawArrayOfData = arrayOfData.map { $0.rawValue }
UserDefaults.standard.setValue(rawArrayOfData, forKey: "hello")
guard let data = UserDefaults.standard.value(forKey: "hello") as? [DataType.RawValue] else {
return
}
let saved = data.map{ DataType(rawValue: $0)!}
print(saved)