【发布时间】:2019-06-02 08:03:46
【问题描述】:
我有一个UserDefaults 类,用于处理存储、删除和获取存储对象的默认值。这是完整的课程,简洁明了,我相信:
现在问题在于存储功能。我似乎无法编码 Encodable String 对象。我知道我可以将该对象存储为默认值,但这会破坏处理通用对象的 MVDefaults 的目的。
我在这里遗漏了什么?
import Foundation
enum MVDefaultsKey: String {
case requestToken = "defaultsRequestToken"
}
/// The class that has multiple class functions for handling defaults.
/// Also has the helper class functions for handling auth tokens.
class MVDefaults {
// MARK: - Functions
/// Stores token.
class func store<T: Encodable>(_ object: T, key: MVDefaultsKey) {
let encoder = JSONEncoder()
let encoded = try? encoder.encode(object)
UserDefaults.standard.set(encoded, forKey: key.rawValue)
}
/// Removes the stored token
class func removeDefaultsWithKey(_ key: MVDefaultsKey) {
UserDefaults.standard.removeObject(forKey: key.rawValue)
}
/// Returns stored token (optional) if any.
class func getObjectWithKey<T: Decodable>(_ key: MVDefaultsKey, type: T.Type) -> T? {
guard let savedData = UserDefaults.standard.data(forKey: key.rawValue) else {
return nil
}
let object = try? JSONDecoder().decode(type, from: savedData)
return object
}
}
【问题讨论】:
-
不要
try?,永远不要将try?与Codable结合使用。 捕捉错误并print它,或者——甚至更好——创建方法throw并将错误交给调用者。并请说明MVDefaults类的用法。
标签: ios swift generics codable