我正在尝试使用Coredata实现Codable。我已经尝试过以下答案,但仍然没有运气。
How to use swift 4 Codable in Core Data?
我遇到的错误/问题是我的项目继续说:"参数类型'用户'不符合预期类型' Encodable'每当我尝试编码或解码对象时。
我在CoreData中创建了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'不符合预期类型'可解码'
当我尝试编码时,我收到一条警告,上面写着"参数类型'用户'不符合预期类型' Encodable'
答案 0 :(得分:0)
您的问题可能与CoreData / Codable无关,而是与导入的用户模型有关,实际上该模型不符合Codable。
Firebase在User
(Reference)中定义FirebaseAuth.framework
。如果您import Firebase
位于文件顶部,则还会导入该用户声明。 IMO这是Firebase的错误API设计,因为许多使用FirebaseAuth的应用程序在某些时候都会有一个带有一些自定义属性的用户模型......
如果您不需要该文件中的FirebaseAuth,只需导入更具体的Firebase框架,例如import FirebaseDatabase
以避免导入其用户模型。
否则,为了帮助编译器选择用户模型而不是导入的模型,您可以使用模块名称User.self
明确地添加YourModule.User.self
。