我正在尝试用Coredata实现Codable。我尝试过以下答案,但仍然没有运气。
How to use swift 4 Codable in Core Data?
我遇到的错误/问题是我的项目继续说:“每当我尝试编码或解码对象时,参数类型'用户'不符合预期类型'可编码'。
我在Core Data中创建了Entity并创建了NSManagedObject子类:
import Foundation
import CoreData
@objc(User)
public class User: NSManagedObject, Codable {
// MARK: - Codable setUp
enum CodingKeys: String, CodingKey {
case fullname
case email
case zipcode
case usertype = "user_type"
}
// MARK: - Decoding the data
required convenience init(from decoder: Decoder) {
guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else {NSLog("Error: with User context!")
return
}
guard let entity = NSEntityDescription.entity(forEntityName: "User", in: context) else {
NSLog("Error with user enity!")
return
}
self.init(entity: entity, in: context)
let values = try decoder.container(keyedBy: CodingKeys.self)
fullname = try values.decode(String.self, forkey: .fullname)
email = try values.decode(String.self, forkey: .email)
zipcode = try values.decode(String.self, forkey: .zipcode)
userType = try values.decode(String.self, forkey: .userType)
}
// MARK: - Encoding the data
func encode(to encoder: Encoder) throws {
var container = try encoder.container(keyedBy: CodingKeys.self)
try container.encode(fullname, forkey: .fullname)
try container.encode(email, forkey: .email)
try container.encode(usertype, forkey: .usertype)
try container.encode(zipcode, forkey: .zipcode)
}
}
// This helps with decoding
extension CodingUserInfoKey {
static let context = CodingUserInfoKey(rawValue: "context")
}
当我尝试解码对象并将用户保存到firebase时,我收到一条警告:“在参数类型'User.Type'中,'User'不符合预期类型'Decodable'
当我尝试编码时,我收到一条警告说“参数类型'用户'不符合预期类型'可编码'
用户'不符合预期类型'可解码
由于拼写错误(案件敏感性很重要):
case usertype ...
对阵...forKey: .userType)
而encode/decode(:forKey:)
方法有一个资本K
您的问题可能与CoreData / Codable无关,而是与导入的用户模型有关,实际上不符合Codable。
Firebase在他们的User
(FirebaseAuth.framework
)中定义了一个Reference。如果你在文件顶部的import Firebase
,它也将导入该用户声明。 IMO这是Firebase的糟糕API设计,因为许多使用FirebaseAuth的应用程序在某些时候都会有一个带有一些自定义属性的用户模型......
如果您在该文件中不需要FirebaseAuth,只需导入更具体的Firebase框架,例如import FirebaseDatabase
以避免导入其用户模型。
否则,为了帮助编译器选择用户模型而不是导入的模型,您可以使用模块名称明确地添加User.self
:YourModule.User.self
。