不符合协议 Decodabel 和 Encodable

Posted

技术标签:

【中文标题】不符合协议 Decodabel 和 Encodable【英文标题】:Does not conform to protocol Decodabel and Encodable 【发布时间】:2020-10-08 19:51:30 【问题描述】:

谁能告诉我我的方法有什么问题?错误是

类型“用户”不符合协议“可解码” 类型“用户”不符合协议“可编码”

我尝试用 String.self 替换 Var id、pushId 和 avatarLink 的空字符串,但也无济于事。

请帮忙

struct User: Codable, Equatable
    
    var id = ""
    var username = String.self
    var email = String.self
    var pushId = ""
    var avatarLink = ""
    var status = String.self

    static var currentId: String 
        return Auth.auth().currentUser!.uid
    
    
    static var currentUser: User? 
        if Auth.auth().currentUser != nil 
            if let dicctionary = UserDefaults.standard.data(forKey: kCURRENTUSER) 
                
                let decoder = JSONDecoder()
                do 
                    let userObject = try decoder.decode(User.self, from: dicctionary)
                    return userObject
                 catch 
                    print("Error decoding user from user defaults ", error.localizedDescription)
                
                
            
        
        
        return nil
    
    
    static func == (lhs: User, rhs: User) -> Bool 
        lhs.id == rhs.id
    
    

【问题讨论】:

检查 Encodable 和 Decodable 的文档以获取所需的方法而不是需要实现的方法。 属性 id、pushId 和 avatarLink 都是字符串,它们本身是可编码的,但用户名、电子邮件和状态是 String.type(不是字符串)并且不可编码。 【参考方案1】:

当你写var username = String.self时,username属性的类型将不是String,而是String.Type。基本上,它保存的不是字符串,而是类型。类型本身是不可编码或不可解码的,因此整个结构不能被隐式编码。

如果您希望 usernameemailstatus 包含字符串,但不包含类型,但不希望它们具有空字符串的默认值(如 idpushId) ,只需将它们声明如下:var username: String.

这将使 Swift 编译器能够为您合成 Codable 一致性。

【讨论】:

以上是关于不符合协议 Decodabel 和 Encodable的主要内容,如果未能解决你的问题,请参考以下文章

类型“ViewController”不符合协议“UITableViewDataSource”

类型“AnyObject”不符合协议“NSFetchRequestResult”

协议扩展,不符合协议

UITableView 不符合协议

类型“ViewController”不符合协议

类型 '' 不符合协议 'Decodable'/'Encodable'