首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

类被序列化时,userDefualt不保存开关

当一个类被序列化时,userDefault不保存开关的原因是因为userDefault只能保存一些基本数据类型,如字符串、数字、布尔值等,无法直接保存自定义的类对象。当我们需要将一个自定义类对象保存到userDefault中时,需要先将该对象转换为NSData类型,然后再进行保存。

在iOS开发中,可以通过实现NSCoding协议来实现对象的序列化和反序列化。NSCoding协议要求实现两个方法:encode(with:)和init(coder:)。encode(with:)方法用于将对象的属性编码为NSData类型,而init(coder:)方法用于从NSData类型解码并初始化对象的属性。

以下是一个示例代码,演示了如何将一个自定义类对象保存到userDefault中:

代码语言:txt
复制
import Foundation

class MyClass: NSObject, NSCoding {
    var switchState: Bool
    
    init(switchState: Bool) {
        self.switchState = switchState
    }
    
    func encode(with coder: NSCoder) {
        coder.encode(switchState, forKey: "switchState")
    }
    
    required init?(coder: NSCoder) {
        switchState = coder.decodeBool(forKey: "switchState")
    }
}

// 将对象保存到userDefault中
let myObject = MyClass(switchState: true)
let encodedData = NSKeyedArchiver.archivedData(withRootObject: myObject)
UserDefaults.standard.set(encodedData, forKey: "myObject")

// 从userDefault中读取对象
if let decodedData = UserDefaults.standard.object(forKey: "myObject") as? Data {
    if let decodedObject = NSKeyedUnarchiver.unarchiveObject(with: decodedData) as? MyClass {
        print(decodedObject.switchState)
    }
}

在上述代码中,我们定义了一个名为MyClass的自定义类,其中包含一个名为switchState的布尔属性。该类遵循NSCoding协议,并实现了encode(with:)和init(coder:)方法。在encode(with:)方法中,我们使用NSCoder将switchState属性编码为NSData类型。在init(coder:)方法中,我们使用NSCoder从NSData类型解码并初始化switchState属性。

在保存对象时,我们使用NSKeyedArchiver将对象转换为NSData类型,并将其保存到userDefault中。在读取对象时,我们使用NSKeyedUnarchiver从userDefault中获取NSData类型数据,并将其解码为MyClass对象。

需要注意的是,这种方式只适用于保存少量的自定义类对象,如果需要保存大量的自定义类对象,建议使用其他持久化方案,如Core Data或SQLite等。

推荐的腾讯云相关产品:腾讯云对象存储(COS) 腾讯云对象存储(COS)是一种海量、安全、低成本、高可靠的云存储服务,适用于存储各类非结构化数据,如图片、音视频、文档等。它提供了简单易用的API接口和丰富的功能,可以满足各种存储需求。

产品介绍链接地址:https://cloud.tencent.com/product/cos

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券