【发布时间】:2021-06-17 08:10:04
【问题描述】:
我是 iOS 新手,正在尝试将用户对象存储在 UserDefaults 中。这样当应用再次启动时,我可以检查用户类型并根据它导航到相关屏幕。
为此,我创建了一个如下的用户类(可编码),它有一个 userType 枚举属性!
enum UserType: Int, Codable {
case userType1 = 0
case userType2 = 1
case notDetermined = 2
init(from decoder: Decoder) throws {
let label = try decoder.singleValueContainer().decode(Int.self)
self = UserType(rawValue: label) ?? .notDetermined
}
}
class User: Codable {
public var userFullName: String? = ""
public var userType: UserType? //= .notDetermined
enum CodingKeys: String, CodingKey {
case userFullName
}
}
在我的视图控制器类中,我正在为用户对象创建一个新实例并尝试存储用户默认值,如下所示:
let newUser = User()
newUser.userFullName = "Test"
newUser.userType = userTypeBtn.isSelected ? .userType1 : .userType2
当我打印 newUser 的 userType 时,无论选择哪个,我都能看到正确的值。但在那之后,当我尝试将其存储在 userDefaults 中时,它会为 userType 属性返回 nil。
do {
let encoded = try JSONEncoder().encode(newValue)
UserDefaults.standard.set(encoded, forKey: UserDefaultKey.currentUser)
UserDefaults.standard.sync()
} catch {
print("Unable to Encode User Object: (\(error))")
}
当我尝试打印这个 encoded 变量并在控制台中对其进行解码时
JSONDecoder().decode(User.self, from: encoded).userType
它打印 nil。
请帮助我如何在 UserDefaults 中存储可选枚举属性并在需要时使用 Codable 检索它
【问题讨论】:
-
为什么在
CodingKeys枚举中只包含userFullName? -
@Sweeper 因为我没有从服务器获取它,并且 userType 是 JSON 响应之外的外部属性!之前我在 CodingKeys 中也添加了 userType,但问题仍然存在!
-
添加它应该不会破坏您的 JSON 解析代码,不是吗?保存到
UserDefaults不起作用的原因是因为您没有将userType作为编码键。 -
“但问题仍然存在!”
-
@Sweeper 我从模拟器中删除了该应用程序并重新启动它。我对 CodingKey 的想法是,如果我们希望定义自己的属性名称而不是从服务器接收到的名称,我们可以将服务器键映射到我们自己定义的键。这就是我所相信的!