我试图将MKAnnotations保存到我正在学习的课程中的核心数据中。
我已经查看过github上其他学生的代码了,他们都采用了相同的方法来创建一个子类MKAnnotation的自定义NSManagedObject类。
var coordinate: CLLocationCoordinate2D {
set {
...
}
get {
...
}
}
override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) {
super.init(entity: entity, insertIntoManagedObjectContext: context)
}
init(latitude: Double, longitude: Double, context: NSManagedObjectContext) {
super.init(entity: entity!, insertIntoManagedObjectContext: context)
self.lat = ....
}
我不了解super.inits。
MKAnnotation需要一个坐标变量来解释第一组代码,这是有道理的。
在代码的第2和第3段中,覆盖init调用super.init的目的是什么? github上的每个例子都有非常相似的代码,所以这是解决这个问题的唯一方法吗?为什么有必要这样做呢?
答案 0 :(得分:1)
首先,MKAnnotation
是一个协议,而不是一个类。您不能将两个不同的类子类化,但是您可以拥有一个子类,它可以采用任意数量的协议。但这与你的班级没有直接关系。
super.init
调用的原因与Core Data无关。它更多的是关于Swift初始化。每个班级至少有一个“指定”初始化程序。 Swift要求这些类调用其超类的指定初始化程序。 NSManagedObject
指定的初始化程序为init(entity:, insertIntoManagedObjectContext:)
,因此任何子类必须调用它才能完成初始化。
当涉及到类继承时,Swift的初始化规则还有很多。如果您的课程尚未涵盖Apple's documentation on the subject,则可能需要查看。