Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 快速编码设计_Swift_Codable - Fatal编程技术网

Swift 快速编码设计

Swift 快速编码设计,swift,codable,Swift,Codable,我的应用程序和Codable的使用存在“设计”问题 我负责管理马匹、教练和课程。 我使用了一个马数组、一个讲师数组和一个类数组(引用马和讲师),所有这些都是变量 现在我希望将它放在一个库对象中,并在这个对象上使用Codable 我刚刚创建了一个库类,每个库类内部都有一个数组。 我可以很好地加载一个JSON文件,所有数组都被填充,除了我失去了对马和教练的引用 当我加载类时,如果它有一匹关联的马,并且创建了一个新对象,那么它不会引用已经加载的马 类库: class Library : Codable

我的应用程序和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?}
你知道如何解决我的问题吗

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

谢谢,
Nicolas

最简单的解决方案是显式实现Decodable,并将类对象的属性设置为对库中horse和讲师对象的引用。这将向库类添加以下内容:

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

使用JSON/XML/Codable很难处理复杂的图形。本质上,您需要编写自己的编码/解码实现,用ID序列化对象,然后在反序列化后,在表中查找对象是否已经存在反序列化的ID。您可以发布一些JSON示例吗?谢谢!!这就是我选择的解决方案。。。它工作得很好,我只是想可能有更好的方法来处理这个问题。