Swift 领域列表问题<&燃气轮机;和对象映射器
我有一个老项目,我正在尝试从Swift 3移植到Swift 4再移植到Swift 5。看起来我最终需要离开ObjectMapper,但在此之前,我需要修复此错误,以使代码再次编译。不幸的是,这只是我整个代码库中的许多实例之一,所以我无法避免 代码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
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这些对象的排序似乎并不重要,因为你总是按日期排序。似乎没有理由这样做——为什么不对结果进行排序并称之为“完成”呢?