创建自定义核心数据类是否为MKAnnotation的子类?

时间:2017-08-03 17:46:18

标签: ios swift core-data

我试图将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上的每个例子都有非常相似的代码,所以这是解决这个问题的唯一方法吗?为什么有必要这样做呢?

1 个答案:

答案 0 :(得分:1)

首先,MKAnnotation是一个协议,而不是一个类。您不能将两个不同的类子类化,但是您可以拥有一个子类,它可以采用任意数量的协议。但这与你的班级没有直接关系。

super.init调用的原因与Core Data无关。它更多的是关于Swift初始化。每个班级至少有一个“指定”初始化程序。 Swift要求这些类调用其超类的指定初始化程序。 NSManagedObject指定的初始化程序为init(entity:, insertIntoManagedObjectContext:),因此任何子类必须调用它才能完成初始化。

当涉及到类继承时,Swift的初始化规则还有很多。如果您的课程尚未涵盖Apple's documentation on the subject,则可能需要查看。