代码

Person.swift

import UIKit

// 使类遵循NSCoding协议,它通过扩展您的数据类以支持编码和解码功能。它的任务就是把数据写到数据缓存,最后持久保存到磁盘中
// 实现NSSecureCoding协议中的属性,确保能够以可靠的方式进行编码和解码,以防止对象被替换这样的攻击方式
class Person: NSObject, NSCoding, NSSecureCoding {
    
    var name: String
    // 实现协议中的方法,用来实现类的实例的编码操作
    func encode(with coder: NSCoder) {
        coder.encode(name,forKey:"name")
    }
    // 添加一个初始化方法,用来设置属性的值
    required init(name: String = "")
    {
        self.name = name
    }
    // 添加一个协议中的初始化方法,用来实现类的实例的解码操作
    required init?(coder: NSCoder) {
        self.name = coder.decodeObject(forKey:"name") as? String ?? ""
    }

    static var supportsSecureCoding: Bool = true
}

ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        // UserDefaults类用于保存应用程序的设置和属性以及用户数据,存储在其中的数据在整个应用程序的生命周期中可以随时调用
        let userDefault = UserDefaults.standard
        userDefault.set(35, forKey: "MyAge")
        // 通过synchronize方法,把数据持久化到位于沙箱中的数据文件
        userDefault.synchronize()
        print(userDefault.integer(forKey: "MyAge"))
        // 单精度浮点数
        userDefault.set(78.5, forKey: "percentage")
        userDefault.synchronize()
        print(userDefault.float(forKey: "percentage"))
        // 双精度浮点数
        userDefault.set(3.141592, forKey: "PI")
        userDefault.synchronize()
        print(userDefault.double(forKey: "PI"))
        // 布尔类型
        userDefault.set(true, forKey: "IsPassed")
        userDefault.synchronize()
        print(userDefault.bool(forKey: "IsPassed"))
        // 网址类型
        userDefault.set(URL(string: "https://www.baidu.com/")!, forKey: "URL")
        userDefault.synchronize()
        print(userDefault.url(forKey: "URL")!)
        // 字符串
        userDefault.set("https://www.baidu.com/", forKey: "Baidu")
        userDefault.synchronize()
        print(userDefault.string(forKey: "Baidu")!)
        // 数组
        userDefault.set(["Xcode","Swift"], forKey: "Language")
        userDefault.synchronize()
        print(userDefault.array(forKey: "Language") as! [String])
        // 字典
        userDefault.set(["Name":"Jerry"], forKey: "User")
        userDefault.synchronize()
        print(userDefault.dictionary(forKey: "User") as! [String : String])
    
        // 使用删除对象方法,删除指定键下的内容
        userDefault.removeObject(forKey: "User")
        userDefault.synchronize()
        print(userDefault.dictionary(forKey: "User") ?? "")
        
        // 接着归档一个对象的实例,首先添加一条异常捕捉语句
        do {
            let person = Person()
            person.name = "Smith"
            // 然后通过归档数据方法,将符合NSCoding协议的对象进行归档
            let personData = try NSKeyedArchiver.archivedData(withRootObject: person, requiringSecureCoding: true)
            userDefault.set(personData, forKey: "Teacher")
            userDefault.synchronize()
            // 然后对该二进制数据进行解码,并转换为指定的类型,同时输出对象的名称属性的值
            let data = userDefault.data(forKey: "Teacher")
            let teacher = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data!) as? Person
            print(teacher?.name ?? "")
        } catch {
            print(error.localizedDescription)
        }
    }
}

截图

iShot20220410 上午11.39.24.png

Q.E.D.