初始化层次结构:需要帮助理解 self.init 以及它如何指向超级 class

Initializer Hierarchy: Need help understanding self.init and how it points to a super class

我正在尝试了解初始化器的语法及其工作原理。我正在阅读 swift 文档,但我很难理解它们在我正在处理的特定示例中的工作方式。我正在按照教程学习核心数据,但在了解初始化代码的工作原理(或我不了解的任何其他概念)之前,我不想继续完成该项目。

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

Core Data: Note Entity Class

Core Data: Note Class Convenience Initializer

在上面的第一张图片中,我显示了 Core Data 创建的注释实体 Class,在第二张图片中,我添加了一个 convenience init()。注释class扩展中代码的所有额外内容都是我的注释。

注释class 扩展的前两个评论是我发现实体class 层次结构,即超级class 是NSMangedObject (super class) 那么子 class 就是 Note 实体 class。据我了解,NSMangedObject class 有 3 个初始化器,它们是:

  1. init() - 默认初始化程序
  2. init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) - 指定初始化器
  3. 便利初始化(上下文 moc:NSManagedObjectContext) - 便利初始化程序

然后注意实体 class 我唯一拥有的是 便利的 init(title: String, context: NSManagedObjectContext)。对于这个初始化程序,我了解 title 和 creationDate 是如何初始化的,但我的问题是关于 self.init(context: context).

问题:据我阅读 Swift 文档的理解,便利初始值设定项不能指向另一个便利初始值设定项,我认为这是在这里发生的事情?我认为 Note class 中的默认初始化器指向 NSMangedObject 的超级 class 中的初始化器。谁能给我提供一些见解以了解正在发生的事情。

  1. 便捷初始化程序必须调用 self 中的另一个初始化程序。即 all 是必须要做的。在出于任何其他目的说 self 之前,它必须这样做。

  2. 在 Node 扩展中,便利初始化器就是这样做的;它通过调用 self.init(context:).

    开始
  3. 这是合法的,因为 Node 是一个 NSManagedObject 子类(代表一个实体),所以它继承了那个初始化器:

    https://developer.apple.com/documentation/coredata/nsmanagedobject/1640602-init

这就是所有要知道的。 init(context:) 是一个便利初始化器这一事实并不有趣。它是 self 的初始值设定项,这才是最重要的。