这是Apple Swift文档的副本:
只要超类的所有属性都具有初始值, 其内存被认为已完全初始化,第1阶段已完成。
超类的指定初始化程序现在有机会 进一步自定义实例(尽管它没有)。
超类的指定初始化程序完成后, 子类的指定初始值设定项可以执行其他自定义 (虽然它再次没有)。
所以基本上第1阶段确保所有属性都有一个值并将值赋给它们。在阶段2中,这些属性进一步定制。而这种进一步的定制确实让我感到沮丧,因为我无法想到使用进一步定制的单个例子。您能给我一个简单的初始化行为示例,或者提供第1阶段和第2阶段的其他说明吗?感谢
答案 0 :(得分:10)
给定2个类Foo和Bar,其中Bar是Foo的子类:
class Foo {
var a: Int?
var b: Int?
init() {
a = 1
}
}
class Bar: Foo {
var c: Int?
override init() {
super.init() // Phase 1
// Phase 2: Additional customizations
b = 2
c = 3
}
}
当你致电Bar()
时,它会调用super.init()
,第一行是初始化超类,即Foo。因此,一旦完全初始化Foo的属性,就可以在Foo的初始化程序中设置它们。这由Foo初始化程序中的a = 1
表示。
一旦完成,第2阶段开始,继续在super.init()
行之后初始化Bar。您可以在bar或其超类的实例上“执行其他自定义”。这由b = 2
和c = 3
表示。
let x = Bar()
x.a // 1
x.b // 2
x.c // 3
答案 1 :(得分:1)
您希望UIView
始终为红色的示例。 self.frame在第1阶段设置(通过调用[super initWithFrame:frame]
,您在self.backgroundColor
的实施中更改initWithFrame:
,即第2阶段。
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame]; <- Phase 1
if (self) {
//Phase 2
self.backgroundColor = [UIColor redColor];
}
return self;
}
对于Objective-C代码感到抱歉,但在Siwft中它应该是相同的,只是语法不同。
答案 2 :(得分:1)
这样想。第1阶段非常有限。 全部确实设置了所有必需的属性值。在完成之前,您无法执行任何其他操作。
在第1阶段,您无法引用自我,也无法调用其他方法。这是非常有限的。
第1阶段完成后,您可以自由地调用其他方法并引用自己。
您认为在init方法中发生的代码大部分都发生在第2阶段。
如果您有一个管理网络连接的对象,则需要在阶段2中设置该网络连接,例如。
答案 3 :(得分:1)
我在Swift Innitialization中了解第一阶段和第二阶段的例子。
class A {
var a: Int
var b: Int
init() {
// This is phare 1
a = 1
b = 2
}
}
class B: A {
var c: Character
var d: Double
var e: String
overide init() {
// This is phare 1
c = ""
d = 0.0
e = ""
This is Phase 2
d = 10
e = "abc"
}
}
答案 4 :(得分:1)
阶段1:从子类到超类,分配内存和init属性
阶段2:从超类继续到子类,自定义