【问题标题】:Does not conform to protocol Decodabel and Encodable不符合协议 Decodabel 和 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(不是字符串)并且不可编码。

标签: ios swift xcode


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多