gpt4 book ai didi

swift - 为什么需要在 Swift 中为 UIViewController 子类添加空构造函数

转载 作者:可可西里 更新时间:2023-11-01 00:53:21 24 4
gpt4 key购买 nike

为什么我需要添加这些构造函数(空),即使我不会将一些自定义初始化的东西添加到 UIViewController 子类中?

    override init() {
super.init()
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

最佳答案

在 Swift 中,与某些语言不同,子类通常不会继承其父类(super class)的初始化器。自动初始化程序继承只能在特定条件下发生。给定一个类 A:

class A {
var a: Int
var r: Int

init(a: Int) {
self.r = 0
self.a = a
}
}

A 类 B 仅在满足以下两个条件时自动继承初始化器:

一个。子类的所有新引入的属性都已分配默认值。

子类中没有引入新的指定初始化器,或者任何新引入的初始化器提供了它们自己的父类(super class)初始化器的实现:

//All values assigned, no additional initializers
class C: A {
var c: Int = 9
}

//Provides an implementation of class A's initializer
class B: A {
init() {
super(a: 0)
}
}

现在如果我们在一个类中引入一个必需的初始化器,事情就会变得棘手。

class AWithRequired {
var a: Int
var r: Int

init(a: Int) {
self.r = 0
self.a = a
}

required init(a: Int, r: Int) {
self.r = r
self.a = a
}

}

在这种情况下,我们不能在不重写必需的初始化器的情况下引入任何非指定的初始化器:

//Still OK--no new initializers introduced
class BWithRequired: AWithRequired {
var b: Int = 9
}

//Doesn't ovverride required initializer, throws an error
class CWithRequired: AWithRequired {
init() {
super.init(a: 0, r: 0)
}
} //ERROR: Required Initializer must be supplied by subclass of 'AWithRequired'

//OK, overrides required initializer
class DWithRequired: AWithRequired {
required init(a: Int, r: Int) {
super.init(a: 0, r: 0)
}
}

//OK, provides non-designated initializer
class EWithRequired: AWithRequired {
convenience init() {
self.init(a: 0, r: 0)
}
}

正如您从示例中看到的那样,绕过限制并仍然实现自定义初始化程序的唯一方法是引入一个非指定的,例如convenience 初始化程序。

关于swift - 为什么需要在 Swift 中为 UIViewController 子类添加空构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28834949/

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