首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Swift将Codable用于归档

通过Swift将Codable用于归档
EN

Stack Overflow用户
提问于 2019-01-11 08:54:37
回答 2查看 189关注 0票数 0

我正试着用could在一个iOS应用中保存一些来自textFields的数据,但是当我定义归档函数时,xcode告诉我“泛型参数‘值’无法被推断”。

我正在学习归档,如果有人能帮我,我会很高兴的。

这是我正在使用的代码

代码语言:javascript
复制
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")
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2019-01-11 14:32:04

第一件事是让你的结构符合Codable协议,比如:

代码语言:javascript
复制
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实现该目标,如下所示:

代码语言:javascript
复制
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")
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2019-01-11 09:07:41

这里似乎有几个问题。直接回答您的问题:“无法推断泛型参数'Value‘”。is:您忘记添加协议:

代码语言:javascript
复制
 struct Profile: Codable {
...}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54138982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档