Как установить массив перечислений в UserDefaults swift - PullRequest
0 голосов
/ 11 января 2019

У меня есть пользовательский тип массива enum, и я хочу сохранить его в UserDefaults, используя swift4.

enum DataType : Int
{
   case cloud = 1, files = 2, googleDrive = 3, mega = 4, others = 5
}
//
let arrayOfData : [DataType] = [.cloud, .files, .mega]

Я хочу сохранить этот массив в UserDefaults.

Ответы [ 5 ]

0 голосов
/ 11 января 2019

Марка 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)}
0 голосов
/ 11 января 2019

Хранить rawValues ​​DataType. Затем при получении массива из 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) }
0 голосов
/ 11 января 2019

Вы можете использовать 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

    }
 }
0 голосов
/ 11 января 2019

сначала конвертируйте 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)
0 голосов
/ 11 января 2019

Вы можете сохранить свой массив в UserDefaults, как показано ниже:

UserDefaults.standard.set(arrayOfData, forKey: "YourKeyName")

Надеюсь, это поможет.

...