Swift 领域列表问题<&燃气轮机;和对象映射器

Swift 领域列表问题<&燃气轮机;和对象映射器,swift,realm,objectmapper,Swift,Realm,Objectmapper,我有一个老项目,我正在尝试从Swift 3移植到Swift 4再移植到Swift 5。看起来我最终需要离开ObjectMapper,但在此之前,我需要修复此错误,以使代码再次编译。不幸的是,这只是我整个代码库中的许多实例之一,所以我无法避免 代码let sortedWorkoutDiary=List(from:exercise.workoutDiary.sorted(byKeyPath:“date”)生成的参数类型“Results”不符合预期类型“Decoder”错误: func rec

我有一个老项目,我正在尝试从Swift 3移植到Swift 4再移植到Swift 5。看起来我最终需要离开ObjectMapper,但在此之前,我需要修复此错误,以使代码再次编译。不幸的是,这只是我整个代码库中的许多实例之一,所以我无法避免

代码
let sortedWorkoutDiary=List(from:exercise.workoutDiary.sorted(byKeyPath:“date”)
生成的
参数类型“Results”不符合预期类型“Decoder”
错误:

    func recordWorkout(_ newWorkout: Workout) {
        let lastWorkout = exercise.workoutDiary.last // grab the last workout for later comparison

        let realm = try! Realm()
        try! realm.write {
            exercise.workoutDiary.append(newWorkout) // write the workout no matter what
        }

        if let secondToLastWorkout = lastWorkout { // only bother checking out of order if there is a last workout...
            if newWorkout.date < secondToLastWorkout.date { // ...and now look to see if they are out of order
                let sortedWorkoutDiary = List(from: exercise.workoutDiary.sorted(byKeyPath: "date")) // ERROR: Argument type 'Results<Workout>' does not conform to expected type 'Decoder'
                try! realm.write {
                    exercise.workoutDiary.removeAll()
                    exercise.workoutDiary.append(objectsIn: sortedWorkoutDiary)
                }
            }
        }
    }
func-recordWorkout(\unewworkout:Workout){
让lastWorkout=exercise.workoutDiary.last//抓取最后一次训练,以便稍后进行比较
让realm=try!realm()
试试看!写吧{
exercise.workoutDiary.append(newWorkout)//无论发生什么情况,都要编写训练
}
如果让secondToLastWorkout=lastWorkout{//只有在有最后一次训练时才麻烦检查出顺序。。。
如果newWorkout.date
下面是向ObjectMapper添加领域列表支持的代码

class ListTransform<T:RealmSwift.Object> : TransformType where T:Mappable {

    typealias Object = List<T>
    typealias JSON = [[String:Any]]

    let mapper = Mapper<T>()

    func transformFromJSON(_ value: Any?) -> List<T>? {
        let result = List<T>()
        if let tempArr = value as? [Any] {
            for entry in tempArr {
                let mapper = Mapper<T>()
                let model : T = mapper.map(JSONObject: entry)!
                result.append(model)
            }
        }
        return result
    }

    func transformToJSON(_ value: Object?) -> JSON? {
        var results = [[String:Any]]()
        if let value = value {
            for obj in value {
                let json = mapper.toJSON(obj)
                results.append(json)
            }
        }
        return results
    }
}
class ListTransform:TransformType其中T:Mappable{
typealias对象=列表
typealias JSON=[[String:Any]]
设mapper=mapper()
func transformFromJSON(uvalue:Any?->List{
让结果=列表()
如果让tempArr=值为?[任何]{
以tempArr格式输入{
设mapper=mapper()
让model:T=mapper.map(JSONObject:entry)!
结果追加(模型)
}
}
返回结果
}
func transformToJSON(uvalue:Object?->JSON{
var结果=[[String:Any]]()
如果let value=value{
对于obj的价值{
让json=mapper.toJSON(obj)
results.append(json)
}
}
返回结果
}
}
对象的简化视图:

final class Exercise: Object, Mappable {

    dynamic var name = ""
    dynamic var notes: String?
    var workoutDiary = List<Workout>()
    dynamic var goal = 0

}

extension Exercise {

    func mapping(map: Map) {
        id <- map["id"]
        name <- map["name"]
        notes <- map["notes"]
        workoutDiary <- (map["workoutDiary"], ListTransform<Workout>())
        bodyWeightMultiplier <- map["bodyWeightMultiplier"]
        sortOrder <- map["sortOrder"]
        username <- map["username"]
    }

}

final class Workout: Object, Mappable {

    dynamic var date = NSDate()
    var sets = List<WorkSet>()

}

extension Workout {

    func mapping(map: Map) {
        date <- (map["date"], DateTransform())
        sets <- (map["sets"], ListTransform<WorkSet>())
    }

}
最终类练习:对象,可映射{
动态变量名称=“”
动态变量注释:字符串?
var workoutDiary=List()
动态var目标=0
}
延伸练习{
func映射(映射:映射){

答案是训练对象不是可解码的。你通常会做
class-Workout:Decodable
。但是这个错误表明你试图解码一个包含训练对象的结果对象?这是故意的吗?你没有指出是哪一行导致了错误,所以你能澄清一下吗?错误是在c中内联的ode:
let sortedWorkoutDialog=List(from:exercise.workoutDialog.sorted(byKeyPath:“date”))
我已经进行了调整,使其更易于查看。这不是List的正确用法-定义为List(from:Decoder)抛出-通过对给定解码器进行解码来创建一个新实例,因此传递的任何内容都必须符合可解码协议。但是,首先不清楚为什么要这样做;代码获取一个Results对象,按日期排序,将其分配给一个列表,然后将该列表放回原始Results对象进行保存。ord这些对象的排序似乎并不重要,因为你总是按日期排序。似乎没有理由这样做——为什么不对结果进行排序并称之为“完成”呢?