不符合协议 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
。基本上,它保存的不是字符串,而是类型。类型本身是不可编码或不可解码的,因此整个结构不能被隐式编码。
如果您希望 username
、email
和 status
包含字符串,但不包含类型,但不希望它们具有空字符串的默认值(如 id
或 pushId
) ,只需将它们声明如下:var username: String
.
这将使 Swift 编译器能够为您合成 Codable
一致性。
【讨论】:
以上是关于不符合协议 Decodabel 和 Encodable的主要内容,如果未能解决你的问题,请参考以下文章
类型“ViewController”不符合协议“UITableViewDataSource”