首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同时使用Codable和Coredata?

如何同时使用Codable和Coredata?
EN

Stack Overflow用户
提问于 2018-03-03 07:20:26
回答 2查看 2.7K关注 0票数 1

我正在尝试用Coredata实现Codable。我试着遵循下面的答案,但仍然没有成功。

How to use swift 4 Codable in Core Data?

我遇到的错误/问题是我的项目一直在说:“每当我尝试编码或解码对象时,参数类型'User‘不符合预期的类型'Encodable’。

我已经在CoreData中创建了实体,并创建了NSManagedObject子类:

代码语言:javascript
复制
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‘”

当我尝试编码时,我得到一个警告,说“参数类型'User‘不符合预期的类型'Encodable’”

EN

回答 2

Stack Overflow用户

发布于 2018-03-03 18:37:02

可解码的

用户“不符合预期类型”

由于输入错误而发生(区分大小写):

case usertype ......forKey: .userType)

并且encode/decode(:forKey:)方法有一个大写的K

票数 0
EN

Stack Overflow用户

发布于 2018-03-05 17:34:46

您的问题可能与CoreData/Codable无关,而是与导入的用户模型有关,该用户模型实际上不符合Codable。

Firebase在它们的FirebaseAuth.framework (Reference)中定义了一个User。如果您在文件的顶部执行import Firebase,它也会导入该用户声明。这是Firebase设计的糟糕的应用程序接口,因为许多也使用FirebaseAuth的应用程序在某些时候会有一个带有一些自定义属性的用户模型。

如果你在该文件中不需要FirebaseAuth,只需导入更具体的Firebase框架,例如import FirebaseDatabase,以避免导入他们的用户模型。

否则,为了帮助编译器选择您的用户模型而不是导入的模型,您可以显式地在User.self前面加上您的模块名:YourModule.User.self

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49078853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档