【问题标题】:Swift Codable DesignSwift 可编码设计
【发布时间】:2018-03-24 19:53:53
【问题描述】:

我的应用程序和 Codable 的使用存在“设计”问题。

我负责管理马匹、教练和课程。 我正在使用一组马匹、一组教练员和一组课程(引用马匹和教练员),所有这些都作为变量。

现在我希望将它放在一个库对象中,并在此对象上使用 Codable。

我刚刚创建了一个库类,其中每个类都有一个数组。 我可以很好地加载 JSON 文件,并且所有数组都已填充,除非我丢失了马和教练的参考。

当我加载类时,如果它有关联的马,则会创建一个新对象,它不会引用已加载的马。

类库:

class Library : Codable {

var name:String=""

// Instructors
var instructors:[Instructor] = [Instructor]()

// Horses
var horses:[Horse] = [Horse]()

// Courses
var courses:[Course] = [Course]()}

课堂课程:

class Course : Codable {

var id:Int

var date:Date

var horse:Horse?

var instructor:Instructor?}

知道如何解决我的问题吗?

我并不是特别在寻找技术答案,但是您将如何解决此问题;)

谢谢, 尼古拉斯

【问题讨论】:

  • 使用 JSON/XML/Codable 很难处理复杂的图。本质上,您需要编写自己的编码/解码实现,使用其 ID 序列化对象,然后在反序列化时,在表中查找以查看是否已经存在具有反序列化 ID 的对象
  • 你能发布一些示例 JSON 吗?

标签: swift codable


【解决方案1】:

最简单的解决方案是显式实现 Decodable 并将类对象的属性设置为对库中马和指导员对象的引用。这会将以下内容添加到 Library 类中:

enum CodingKeys: String, CodingKey {
        case name
        case instructors
        case horses
        case courses
    }

init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    name = try values.decode(Double.self, forKey: .name)
    instructors = try values.decode(Double.self, forKey: .instructors)
    horses = try values.decode(Double.self, forKey: .horses)
    courses = try values.decode(Double.self, forKey: .courses)

    for course in courses {
        for hourse in horses {
            if(course.horse.id == horse.id){
                course.horse = horse
                break
            }
        }
        for instructor in insturctors{
            if(course.instructor.id == instructor.id){
                course.instructor = instructur
                break
            }
        }
    }
}

【讨论】:

  • 谢谢!!这实际上是我选择的解决方案......它工作正常,但我可能有更好的方法来处理这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
相关资源
最近更新 更多