ios - 使用 Codable 与 Swift 归档

标签 ios json swift codable

我正在尝试使用 codable 在 iOS 应用程序中快速保存来自 textFields 的一些数据,但是当我定义用于归档的函数时,xcode 告诉我“无法推断通用参数‘值’”。

我正在学习归档,如果有人能帮助我,我将非常感激。

这是我正在使用的代码

class ProfileViewController: UITableViewController {
    var currentProfile: Profile?
    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var surname: UITextField!

    @IBAction func saveProfileButton(_ sender: Any) {
        addCurrentProfile()
        saveProfile()
    }

    func addCurrentProfile(){
        currentProfile?.name = name.text ?? ""
        currentProfile?.surname = surname.text ?? ""
    }

    struct Profile {
        var name: String
        var surname: String

        enum CodingKeys: String, CodingKey {
            case name
            case surname

        }

        init(name:String, surname:String) {
            self.name = name
            self.surname = surname
        }

        func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encode(name, forKey: .name)
            try container.encode(surname, forKey: .surname)

        }

        init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            name = try container.decode(String.self, forKey: .name)
            surname = try container.decode(String.self, forKey: .surname)
        }
    }

    func saveProfile() {
        do {
            let data = try PropertyListEncoder().encode(currentProfile)
            let success = NSKeyedArchiver.archiveRootObject(data, toFile: profile_data.path)
            print(success ? "Successful save" : "Save Failed")
        } catch {
            print("Save Failed")
        }
    }
}

最佳答案

首先是让你的结构确认 Codable 协议(protocol),例如:

struct Profile:Codable {
        var name: String
        var surname: String

        enum CodingKeys: String, CodingKey {
            case name
            case surname

        }

        init(name:String, surname:String) {
            self.name = name
            self.surname = surname
        }

        func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encode(name, forKey: .name)
            try container.encode(surname, forKey: .surname)

        }

        init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            name = try container.decode(String.self, forKey: .name)
            surname = try container.decode(String.self, forKey: .surname)
        }
    }

然后,您可以使用 PropertyListEncoder 实现对象,如下所示:

func saveProfile() {
        do {
            let data = try PropertyListEncoder().encode(currentProfile)
            let success = NSKeyedArchiver.archiveRootObject(data, toFile: profile_data.path)
            print(success ? "Successful save" : "Save Failed")
        } catch {
            print("Save Failed")
        }
    }

关于ios - 使用 Codable 与 Swift 归档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54138982/

相关文章:

ios - 我如何使用 AlamoFireObjectMapper 动态映射 JSON 中的值,该值取决于同一 JSON 中的另一个值?

c# - 反序列化动态 JSON 文件 C# NewtonSoft.JSON

java - 无法从 json 中读取 URL 字符串并将其应用于 Android 中的对象

jquery - 多选 jQuery 中 json 的来源

ios - 如何使自定义 View 的背景颜色属性可动画化?

iphone - 对象AL : Crashing on fadeTo:duration:target:selector:

ios - 动态更改 UILabel 宽度不适用于自动布局

ios - 如果您知道它被调用了 n 次,请等待异步任务完成

ios - onCompleted 永远不会被调用

ios - 有没有一种方法可以在分配之前计算Metal纹理使用的内存量?