标题:Swift 错误:类型“Self”不符合 SwiftyUserDefaults 扩展中的协议“Decodable”
身体: 你好 Swift 社区,
我在处理涉及使用 SwiftyUserDefaults 库的 Swift 项目时遇到问题。我对 Swift 开发比较陌生,希望得到一些解决此错误的指导。
背景: 我正在使用 Swift 构建一个 iOS 应用程序,并合并 SwiftyUserDefaults 来管理用户默认值。我已按照文档操作并将 SwiftyUserDefaults 集成到我的项目中,但遇到了与协议一致性相关的错误。
问题: 当尝试使用 SwiftyUserDefaults 定义某些类型(例如 Date、String、Int 等)的默认值时,我收到以下错误消息:
“类型‘Self’不符合协议‘Decodable’” “‘DefaultsKeyedArchiverBridge’要求‘Self’符合‘Decodable’” 我尝试过的: 我已经查看了有关协议和 Codable 的 Swift 文档,但我仍然很难理解如何解决此问题。我也在网上搜索过类似的问题,但没有找到适用于我的具体场景的解决方案。
代码片段: 以下是我的 SwiftyUserDefaults 扩展中发生错误的摘录:
import Foundation
extension DefaultsSerializable {
public static var _defaultsArray: DefaultsArrayBridge<[T]> { return DefaultsArrayBridge() }
}
extension Date: DefaultsSerializable {
public static var _defaults: DefaultsObjectBridge<Date> { return DefaultsObjectBridge() }
}
extension String: DefaultsSerializable {
public static var _defaults: DefaultsStringBridge { return DefaultsStringBridge() }
}
extension Int: DefaultsSerializable {
public static var _defaults: DefaultsIntBridge { return DefaultsIntBridge() }
}
extension Double: DefaultsSerializable {
public static var _defaults: DefaultsDoubleBridge { return DefaultsDoubleBridge() }
}
extension Bool: DefaultsSerializable {
public static var _defaults: DefaultsBoolBridge { return DefaultsBoolBridge() }
}
extension Data: DefaultsSerializable {
public static var _defaults: DefaultsDataBridge { return DefaultsDataBridge() }
}
extension URL: DefaultsSerializable {
#if os(Linux)
public static var _defaults: DefaultsKeyedArchiverBridge<URL> { return DefaultsKeyedArchiverBridge() }
#else
public static var _defaults: DefaultsUrlBridge { return DefaultsUrlBridge() }
#endif
public static var _defaultsArray: DefaultsKeyedArchiverBridge<[URL]> { return DefaultsKeyedArchiverBridge() }
}
extension DefaultsSerializable where Self: Codable {
public static var _defaults: DefaultsCodableBridge<Self> { return DefaultsCodableBridge() }
public static var _defaultsArray: DefaultsCodableBridge<[Self]> { return DefaultsCodableBridge() }
}
extension DefaultsSerializable where Self: RawRepresentable {
public static var _defaults: DefaultsRawRepresentableBridge<Self> { return DefaultsRawRepresentableBridge() }
public static var _defaultsArray: DefaultsRawRepresentableArrayBridge<[Self]> { return DefaultsRawRepresentableArrayBridge() }
}
extension DefaultsSerializable where Self: NSCoding {
public static var _defaults: DefaultsKeyedArchiverBridge<Self> { return DefaultsKeyedArchiverBridge() }
public static var _defaultsArray: DefaultsKeyedArchiverBridge<[Self]> { return DefaultsKeyedArchiverBridge() }
}
extension Dictionary: DefaultsSerializable where Key == String {
public typealias T = [Key: Value]
public typealias Bridge = DefaultsObjectBridge<T>
public typealias ArrayBridge = DefaultsArrayBridge<[T]>
public static var _defaults: Bridge { return Bridge() }
public static var _defaultsArray: ArrayBridge { return ArrayBridge() }
}
extension Array: DefaultsSerializable where Element: DefaultsSerializable {
public typealias T = [Element.T]
public typealias Bridge = Element.ArrayBridge
public typealias ArrayBridge = DefaultsObjectBridge<[T]>
public static var _defaults: Bridge {
return Element._defaultsArray
}
public static var _defaultsArray: ArrayBridge {
fatalError("Multidimensional arrays are not supported yet")
}
}
extension Optional: DefaultsSerializable where Wrapped: DefaultsSerializable {
public typealias Bridge = DefaultsOptionalBridge<Wrapped.Bridge>
public typealias ArrayBridge = DefaultsOptionalBridge<Wrapped.ArrayBridge>
public static var _defaults: DefaultsOptionalBridge<Wrapped.Bridge> { return DefaultsOptionalBridge(bridge: Wrapped._defaults) }
public static var _defaultsArray: DefaultsOptionalBridge<Wrapped.ArrayBridge> { return DefaultsOptionalBridge(bridge: Wrapped._defaultsArray) }
}
问题: 有人可以解释一下为什么我会遇到这些错误以及如何解决它们吗?此外,如果 SwiftyUserDefaults 不是适合我的用例的最佳解决方案,我愿意接受管理用户默认值的替代建议。
标签:swift、ios、swiftyuserdefaults、可解码、协议一致性
预先感谢您提供的任何帮助或见解!
我为您提供了一个用于管理所有数据类型的示例类,即使您可以在其中存储数据模型,并且您不需要为此使用任何其他库或类。
class Store {
class var authKey: String?
{
set{
Store.saveValue(newValue, .Authorization)
}get{
return Store.getValue(.Authorization) as? String
}
}
class var userDetails: SignUpModel?
{
set{
Store.saveUserDetails(newValue, .userDetails)
}get{
return Store.getUserDetails(.userDetails)
}
}
static var remove: DefaultKeys!{
didSet{
Store.removeKey(remove)
}
}
class func resetDefaults() {
let defaults = UserDefaults.standard
let dictionary = defaults.dictionaryRepresentation()
dictionary.keys.forEach { key in
if key != DefaultKeys.deviceToken.rawValue{
defaults.removeObject(forKey: key)
}
}
}
//MARK:- Private Functions
private class func removeKey(_ key: DefaultKeys)
{
UserDefaults.standard.removeObject(forKey: key.rawValue)
if key == .userDetails{
UserDefaults.standard.removeObject(forKey: DefaultKeys.Authorization.rawValue)
}
UserDefaults.standard.synchronize()
}
private class func saveValue(_ value: Any? ,_ key:DefaultKeys)
{
var data: Data?
if let value = value
{
data = try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
}
UserDefaults.standard.set(data, forKey: key.rawValue)
UserDefaults.standard.synchronize()
}
private class func saveUserDetails<T: Codable>(_ value: T?, _ key: DefaultKeys)
{
var data: Data?
if let value = value
{
data = try? PropertyListEncoder().encode(value)
}
Store.saveValue(data, key)
}
private class func getUserDetails<T: Codable>(_ key: DefaultKeys) -> T?{
if let data = self.getValue(key) as? Data{
let loginModel = try? PropertyListDecoder().decode(T.self, from: data)
return loginModel
}
return nil
}
private class func getValue(_ key: DefaultKeys) -> Any
{
if let data = UserDefaults.standard.value(forKey: key.rawValue) as? Data{
if let value = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
{
return value
}
else{
return ""
}
}else{
return ""
}
}
}
如果您有任何疑问,请随时联系或提出任何问题。