Как сохранить Enum в UserDefaults? - PullRequest
2 голосов
/ 26 марта 2019

Я пытаюсь сохранить enum в UserDefaults, но не могу сделать это успешно, потому что в do try catch я получаю ошибку. Я понял, что это связано с моим enum, потому что когда я удаляю enum в моем классе, он работает как обычно.

class User: NSObject, NSCoding {

    private(set) public var loginType: LoginType
    // some other properties

    init(name: String, username: String, email: String, profileImage: UIImage?) {
        // some other inits
        self.loginType = .email
    }

    init(name: String, username: String, telephoneNumber: String, profileImage: UIImage?) {
        // some other inits
        self.loginType = .telephoneNumber
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.loginType, forKey: LOGIN_TYPE_KEY)
    }

    required init?(coder aDecoder: NSCoder) {
        self.loginType = aDecoder.decodeObject(forKey: LOGIN_TYPE_KEY) as! LoginType
    }
}

вот мое перечисление:

enum LoginType: String {
    case email = "email"
    case telephoneNumber = "telephoneNumber"
}

1 Ответ

4 голосов
/ 26 марта 2019

Вы должны сохранить rawValue из перечисления

func encode(with aCoder: NSCoder) {
    aCoder.encode(self.loginType.rawValue, forKey: LOGIN_TYPE_KEY)
}

required init?(coder aDecoder: NSCoder) {
    let loginRaw = aDecoder.decodeObject(forKey: LOGIN_TYPE_KEY) as! String
    self.loginType = LoginType(rawValue: loginRaw)!
}

Попробуйте использовать Codable вместо NSCoding. Вам не нужен подкласс NSObject, а перечисление RawRepresentable можно сериализовать напрямую.

Если исходные значения соответствуют случаям, перечисление может быть объявлено намного короче

enum LoginType: String {
  case email, telephoneNumber
}
...