{类型“Self”不符合协议“Decodable”}或{“DefaultsKeyedArchiverBridge”要求“Self”符合“Decodable”}

问题描述 投票:0回答:1

标题: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、可解码、协议一致性

预先感谢您提供的任何帮助或见解!

ios swift decodable swiftyuserdefaults
1个回答
0
投票

我为您提供了一个用于管理所有数据类型的示例类,即使您可以在其中存储数据模型,并且您不需要为此使用任何其他库或类。

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 ""
        }
    }
}

如果您有任何疑问,请随时联系或提出任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.