首页 > 解决方案 > 如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据

问题描述

我有一个数组列表

私有 var deviceArray:[SearchPeripheral]?= []

我想在 UserDefaults 中保存设备数组的数据,但是当我存储它时它会崩溃。请帮帮我

谢谢你。

标签: arraysclassstoreuserdefaults

解决方案


您不能将自定义模型存储在 UserDefaults 中。您可以进行以下改进以将对象另存为[[String:Any]]

struct SearchPeripheral: Codable {
    let name: String
    let model: String
}

extension SearchPeripheral {
    var dictionary: [String:Any] {
        let data = try! JSONEncoder().encode(self)
        let any = try! JSONSerialization.jsonObject(with: data)
        return any as! [String:Any]
    }

    init?(_ dict: [String:Any]) {
        guard let peripheral = (try? JSONSerialization.data(withJSONObject: dict)).flatMap({
            try? JSONDecoder().decode(SearchPeripheral.self, from: $0)
        }) else {
            return nil
        }
    
        self = peripheral
    }
}

保存 SearchPeripheral 数组:

func save(_ peripherals: [SearchPeripheral]) {
    let allPeripherals = peripherals.compactMap({$0.dictionary})
    UserDefaults.standard.set(allPeripherals, forKey: "peripherals")
}

获取 SearchPeripherals 数组:

func getPeripherals() -> [SearchPeripheral] {
    let allPeripherals = UserDefaults.standard.array(forKey: "peripherals") as? [[String:Any]] ?? []
    let peripherals = allPeripherals.compactMap(SearchPeripheral.init)
    return peripherals
}

推荐阅读