Использование Codable для архивации с Swift - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь сохранить некоторые данные из textFields в приложении для iOS в быстром с кодируемым, но когда я определяю функцию для архивации, 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")
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Прежде всего, чтобы ваша структура подтвердила протокол Codable, например:

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")
        }
    }
0 голосов
/ 11 января 2019

Кажется, здесь есть несколько вопросов. Прямой ответ на ваш вопрос: Msgstr "Общий параметр" Значение "не может быть выведен". есть: забыли добавить протокол:

 struct Profile: Codable {
...}
...