Swift 可编码设计

Swift Codable Design

我的应用程序和 Codable 的使用存在 "design" 问题。

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

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

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

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

Class图书馆:

class Library : Codable {

var name:String=""

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

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

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

Class课程:

class Course : Codable {

var id:Int

var date:Date

var horse:Horse?

var instructor:Instructor?}

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

我不是特别在寻找技术答案,但你会如何解决这个问题 ;)

谢谢, 尼古拉斯

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

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
            }
        }
    }
}