Swift 快速编码设计
我的应用程序和Codable的使用存在“设计”问题 我负责管理马匹、教练和课程。 我使用了一个马数组、一个讲师数组和一个类数组(引用马和讲师),所有这些都是变量 现在我希望将它放在一个库对象中,并在这个对象上使用Codable 我刚刚创建了一个库类,每个库类内部都有一个数组。 我可以很好地加载一个JSON文件,所有数组都被填充,除了我失去了对马和教练的引用 当我加载类时,如果它有一匹关联的马,并且创建了一个新对象,那么它不会引用已经加载的马 类库:Swift 快速编码设计,swift,codable,Swift,Codable,我的应用程序和Codable的使用存在“设计”问题 我负责管理马匹、教练和课程。 我使用了一个马数组、一个讲师数组和一个类数组(引用马和讲师),所有这些都是变量 现在我希望将它放在一个库对象中,并在这个对象上使用Codable 我刚刚创建了一个库类,每个库类内部都有一个数组。 我可以很好地加载一个JSON文件,所有数组都被填充,除了我失去了对马和教练的引用 当我加载类时,如果它有一匹关联的马,并且创建了一个新对象,那么它不会引用已经加载的马 类库: class Library : Codable
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示例吗?谢谢!!这就是我选择的解决方案。。。它工作得很好,我只是想可能有更好的方法来处理这个问题。