Сохранение моего пользовательского класса в UserDefaults и приведение (разбор) этого UserDefault для достижения значений (Swift 4.2) - PullRequest
0 голосов
/ 16 марта 2019

Я создал фиктивное приложение IOS, чтобы хорошо объяснить мои вопросы.Позвольте мне поделиться этим со всеми деталями:

  • В этом фиктивном приложении для IOS есть 2 страницы: LoginPageViewController.swift и HomepageViewController.swift
  • Значения идентификатора раскадровки: LoginPage, Homepage.
  • На странице входа есть кнопка входа.
  • На домашней странице 3 ярлыка.
  • Приложение запускается со страницы входа.
  • И у меня есть файл класса: UserDetail.swift
  • И есть один переход со страницы входа на домашнюю страницу.Идентификатор segue: LoginPage2Homepage

Файл UserDetail.swift

import Foundation

class UserDetail {
    var accountIsDeleted = false
    var userGUID : String?
    var userAge: Int?
}

Файл LoginPageViewController.swift

import UIKit
class LoginPageViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func loginButtonPressed(_ sender: UIButton) {
        var oUserDetail = UserDetail()
        oUserDetail.accountIsDeleted = true
        oUserDetail.userAge = 38
        oUserDetail.userName = "Dirk Kuyt"

        UserDefaults.standard.set(oUserDetail, forKey: "UserCredentialUserDefaults")
        UserDefaults.standard.synchronize()

        performSegue(withIdentifier: "LoginPage2Homepage", sender: nil)
    }
}

HomepageViewController.swift file

import UIKit

class HomepageViewController: UIViewController {

    var result_userGUID = ""
    var result_userAge = 0
    var result_isDeleted = false


    @IBOutlet weak var labelUserGuidOutlet: UILabel!
    @IBOutlet weak var labelAgeOutlet: UILabel!
    @IBOutlet weak var labelAccountIsDeletedOutlet: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.setVariablesFromUserDefault()

        labelUserGuidOutlet.text = result_userGUID
        labelAgeOutlet.text = String(result_userAge)
        labelAccountIsDeletedOutlet.text = String(result_isDeleted)
    }

    func setVariablesFromUserDefault()
    {
        if UserDefaults.standard.object(forKey: "UserCredentialUserDefaults") != nil
        {
            // I need a help in this scope
            // I have checked already: My UserDefault exists or not.
            // I need to check type of the value in UserDefault if UserDefault is exists. I need to show print if type of the value in UserDefault is not belongs to my custom class.

            // And then i need to cast UserDefault to reach my custom class's properties: userGUID, userAge, isDeleted
        }
        else
        {
            print("there is no userDefault which is named UserCredentialUserDefaults")
        }
    }
}

Мои цели:

  1. Я хотел бы сохранить образец пользовательского класса (oUserDetail) в UserDefaults в LoginPageViewController с действием нажатия кнопки входа в систему.
  2. Я хотел бы проверить ниже на домашней странице в качестве первой задачи: мой UserDefault существует или нет (я уже сделал это)
  3. Я хотел бы проверить это на домашней странице в качестве второй задачи: если мой UserDefault существует,А затем проверьте тип значения UserDefault.Это создано с моим пользовательским классом?Если это не так.print («значение userdefault не создано с вашим классом»)
  4. Третье задание: если UserDefault создан с моим пользовательским классом.А затем проанализируйте это значение.Задайте эти 3 переменные: result_userGUID, result_userAge, result_isDeleted, чтобы они отображались в метках.

Я получаю сообщение об ошибке после нажатия кнопки входа на странице входа.Не могу ли я сохранить свой собственный класс в UserDefaults?Мне нужно иметь возможность сохранять, потому что я вижу эту деталь во время написания:

UserDefaults.standart.set(value: Any?, forKey: String)

Мой пользовательский класс находится в области Any выше.Не правда ли?

1 Ответ

2 голосов
/ 16 марта 2019

Вы не можете сохранить экземпляр класса без соответствия NSCoding / Codable протоколам

class UserDetail : Codable  {
   var accountIsDeleted:Bool? // you can remove this as it's useless if the you read a nil content from user defaults that means no current account
   var userGUID : String?
   var userAge: Int?
}

store

do { 
  let res = try JSONEncoder().encode(yourClassInstance)
  UserDefaults.standard.set(value:res,forKey: "somekey")
}
catch { print(error) }

retrieve

do {
   if let data =  UserDefaults.standard.data(forKey:"somekey") {
      let res = try JSONDecoder().decode(UserDetail.self,from:data)
   } else {
     print("No account")
   }
}
catch { print(error) }
...