Rob*_*ert 86 initialization class swift
考虑两个类:
class A {
var x: Int
init(x: Int) {
self.x = x
}
convenience init() {
self.init(x: 0)
}
}
class B: A {
init() {
super.init() // Error: Must call a designated initializer of the superclass 'A'
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么不允许这样做.最终,每个类的指定初始化叫他们需要的任何值,那么为什么我要重复我自己B的init通过指定一个默认值x再次,当方便init在A会做得很好?
Cra*_*tis 25
这是Swift编程指南中规定的"初始化链接"规则的规则1,其中包括:
规则1:指定的初始值设定项必须从其直接超类中调用指定的初始化程序.
强调我的.指定的初始化程序不能调用便捷初始化程序.
有一个图表与规则一起展示了允许初始化程序"方向":

小智 21
考虑
class A
{
var a: Int
var b: Int
init (a: Int, b: Int) {
print("Entering A.init(a,b)")
self.a = a; self.b = b
}
convenience init(a: Int) {
print("Entering A.init(a)")
self.init(a: a, b: 0)
}
convenience init() {
print("Entering A.init()")
self.init(a:0)
}
}
class B : A
{
var c: Int
override init(a: Int, b: Int)
{
print("Entering B.init(a,b)")
self.c = 0; super.init(a: a, b: b)
}
}
var b = B()
Run Code Online (Sandbox Code Playgroud)
因为A类的所有指定初始值设定项都被重写,所以B类将继承A的所有便利初始值设定项.因此执行此操作将输出
Entering A.init()
Entering A.init(a:)
Entering B.init(a:,b:)
Entering A.init(a:,b:)
Run Code Online (Sandbox Code Playgroud)
现在,如果指定的初始化程序B.init(a:b :)将被允许调用基类便捷初始化器A.init(a :),这将导致对B.init的递归调用(a:,b: ).
Jul*_*ien 13
这是因为你最终可以获得无限递归.考虑:
class SuperClass {
init() {
}
convenience init(value: Int) {
// calls init() of the current class
// so init() for SubClass if the instance
// is a SubClass
self.init()
}
}
class SubClass : SuperClass {
override init() {
super.init(value: 10)
}
}
Run Code Online (Sandbox Code Playgroud)
看看:
let a = SubClass()
Run Code Online (Sandbox Code Playgroud)
将调用SubClass.init()哪个将调用SuperClass.init(value:)哪个将调用SubClass.init().
指定/便利init规则被设计为类初始化始终是正确的.
| 归档时间: |
|
| 查看次数: |
20376 次 |
| 最近记录: |