gpt4 book ai didi

ios - 在 Swift 的 NSObject 子类的初始化器中调用 super.init()

转载 作者:IT王子 更新时间:2023-10-29 05:21:23 26 4
gpt4 key购买 nike

我正在使用 Swift 构建一个 iOS 应用程序并在 Lister 上绘图Apple 提供的示例项目。

Lister 使用两个模型对象:List 和 ListItem。我发现它们都没有在它们的初始化器中调用 super.init(),即使它们是 NSObject 的子类也是如此。

但是,在 Objective-C 版本的 Lister 中,两个模型对象(AAPLList 和 AAPLListItem)都会调用 [super init]

Swift 编程语言明确指出“指定的初始化程序必须从其直接父类(super class)中调用指定的初始化程序。” (Initializer Chaining in Initialization的规则1)

这是怎么回事?为什么这是一个异常(exception),如果您不应该总是在子类中调用 super.init(),那么适用哪些规则?

最佳答案

即使我在文档中找不到描述这一点的地方,但如果子类初始化器是父类(super class)的唯一初始化器,默认的父类(super class)初始化器会在子类初始化器的末尾被调用,而且它不是'明确调用。

NSObject 只有默认初始化器 (init()); 你可以看到父类(super class)初始化器在子类初始化器末尾通过尝试引用 self 被调用(例如,println(self)) 在不调用 super.init() 的构造函数中:您不允许这样做,因为该类未完全初始化那个点。

如果你想在构造函数的某处使用self,对象需要在那个点被完全构造,所以你需要在此之前手动调用super.init()

关于ios - 在 Swift 的 NSObject 子类的初始化器中调用 super.init(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25630031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com