swift - Initializer Hierarchy:需要帮助理解 self.init 以及它如何指向超类
问题描述
我正在尝试了解初始化程序的语法以及它们的工作方式。我正在阅读 swift 文档,我很难理解它们在我正在处理的特定示例中是如何工作的。我正在学习有关核心数据的教程,但在了解初始化代码的工作原理(或我不了解的任何其他概念)之前,我不想继续完成该项目。
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
在上面的第一张图片中,我展示了 Core Data 创建的 Note 实体类,在第二张图片中,我添加了一个方便的 init()。Note 类扩展中的所有额外代码都是我的笔记。
关于 Note 类扩展的前两条评论是我发现的实体类层次结构,即超类是NSMangedObject(超类),然后子类是Note实体类。据我了解, NSMangedObject 类有 3 个初始化器,它们是:
- init() - 默认初始化器
- init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) - 指定初始化
- 便利 init(context moc: NSManagedObjectContext) - 便利初始化器
然后注意实体类,我唯一拥有的是便利 init(title: String, context: NSManagedObjectContext)。对于这个初始化程序,我了解 title 和 creationDate 是如何初始化的,但我的问题是关于self.init(context: context)。
问题:据我了解阅读 Swift 文档,便利初始化程序不能指向另一个便利初始化程序,这就是我认为这里发生的情况?我认为 Note 类的默认初始化程序指向 NSMangedObject 超类的初始化程序。任何人都可以为我提供一些见解以了解正在发生的事情。
解决方案
便利构造器必须在
self
. 这就是它需要做的所有事情。self
在出于任何其他目的说之前,它必须这样做。在 Node 扩展中,便利初始化器就是这样做的;它从调用开始
self.init(context:)
。这是合法的,因为 Node 是一个 NSManagedObject 子类(代表一个实体),所以它继承了那个初始化器:
https://developer.apple.com/documentation/coredata/nsmanagedobject/1640602-init
这就是所有要知道的。便利初始化器这一事实init(context:)
并不有趣。它是 的初始化器self
,这才是最重要的。
推荐阅读
- 3d - Gnuplot 自定义 y 刻度
- azure-sql-database - 通过服务端点从 VNET 访问 Azure SQL
- ssis - 尝试连接到 Excel 工作表时,SSIS 中出现错误 0X80004005
- r - 没有生成 NA 的左连接
- scala - Spark DataFrame 操作性能 - 多个离散操作或单个流水线操作集
- javascript - 如何从构造函数中访问原型对象?
- scala - 如何使用 Scala 将字符串从 arraybuffer 解析为 double?
- java - 从其他类调用时在 Autowired 类上获取 Null
- sql - 在数据库中搜索多种电话号码格式
- android - Android:将复选框矩形与其下方的文本对齐