首页 > 解决方案 > Initializer Hierarchy:需要帮助理解 self.init 以及它如何指向超类

问题描述

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

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

核心数据:注意实体类

核心数据:Note 类便利初始化器

在上面的第一张图片中,我展示了 Core Data 创建的 Note 实体类,在第二张图片中,我添加了一个方便的 init()。Note 类扩展中的所有额外代码都是我的笔记。

关于 Note 类扩展的前两条评论是我发现的实体类层次结构,即超类是NSMangedObject(超类),然后子类是Note实体类。据我了解, NSMangedObject 类有 3 个初始化器,它们是:

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

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

问题:据我了解阅读 Swift 文档,便利初始化程序不能指向另一个便利初始化程序,这就是我认为这里发生的情况?我认为 Note 类的默认初始化程序指向 NSMangedObject 超类的初始化程序。任何人都可以为我提供一些见解以了解正在发生的事情。

标签: swiftcore-datainitialization

解决方案


  1. 便利构造器必须在self. 这就是它需要做的所有事情。self在出于任何其他目的说之前,它必须这样做。

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

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

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

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


推荐阅读