如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据

Posted

技术标签:

【中文标题】如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据【英文标题】:How to set custom class array data in UserDefalts in swift 4 【发布时间】:2021-01-30 16:05:01 【问题描述】:

我有一个数组列表

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

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

谢谢。

【问题讨论】:

【参考方案1】:

您不能将自定义模型存储在 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

【讨论】:

以上是关于如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 - 如何从嵌套在 UICollectionViewCell 中的按钮以编程方式激活 segue

如何使用swift 4查看Multipeer Connectivity框架中的MCBrowserViewController

如何在swift 4中从WKWebView中的网页中删除DIV标签?

如何添加到当前存储在用户默认值 Swift 4 中的数字

如何在 swift 4 中的 tableView Cell 中创建 collectionview? [复制]

如何在 swift 4.0 中获取 firebase-realtime-database 中的特定值