我可以将 SQLite.swift 的 Codable 功能与枚举一起使用吗?

Nei*_*ord 5 ios swift sqlite.swift

我尝试使用 SQLite.swift 的Codable功能插入一行,但收到​​以下错误消息:

Swift.EncodingError.Context(codingPath: [], debugDescription: "Top-level 
MyEnum encoded as number JSON fragment.", underlyingError: nil))
Run Code Online (Sandbox Code Playgroud)

我的枚举扩展Int并且Codable

enum MyEnum : Int, Codable {
    case FIRSTVAL = 0, SECONDVAL = 1
}
Run Code Online (Sandbox Code Playgroud)

消耗它的类如下所示:

class MyClass : Codable {        
    static let tableRef = Table("MyTable")

    static let idColumn = Expression<Int>("MyTableId");
    static let nameColumn = Expression<String>("Name")
    static let myEnumValColumn = Expression<Int>("MyEnumVal")

    static func createTable(_ db : Connection) throws {            
        try db.run(tableRef.create(ifNotExists: true) { t in
            t.column(idColumn, primaryKey: true)
            t.column(nameColumn)
            t.column(myEnumValColumn)
        })            
    }

    var MyTableId : Int!
    var Name : String
    var MyEnumVal : MyEnum
}
Run Code Online (Sandbox Code Playgroud)

尝试插入行并导致引发错误的代码:

try db.run(MyClass.tableRef.insert(anInstanceOfMyClass))
Run Code Online (Sandbox Code Playgroud)

我知道在 SQLite.swift 的文档中它说:

可编码和可解码对象只能使用以下类型:

  • 整型、布尔型、浮点型、双精度型、字符串型
  • 将被编码为 JSON 到单个列的嵌套 Codable 类型

有没有办法强制它使用rawValue枚举的(因为它无论如何都会扩展),也许可以通过手动实现or 的Int编码/解码方法?我试图避免手动编写代码来将数据库中的行反序列化回对象,并从准备好数据库的对象进行序列化。例如,我以前有以下方法(以及其他从数据库加载实体并必须反序列化它们的代码):MyEnumMyClassMyClass

init(row : Row) {
    self.MyTableId = row[MyClass.idColumn]
    self.Name = row[MyClass.nameColumn]       
    self.MyEnumVal = MyEnum(rawValue: Int(row[MyClass.myEnumValColumn]))!
}

func insert(_ db : Connection) throws {
    let insert = MyClass.tableRef.insert(
        MyClass.idColumn <- Int(MyTableId),
        MyClass.nameColumn <- Name,
        MyClass.myEnumValColumn <- Int(MyEnumVal.rawValue)
    )
    try db.run(insert)
}
Run Code Online (Sandbox Code Playgroud)