Swift 阶段 1 和阶段 2 初始化
Phase 1 and Phase 2 initialization in Swift
这是 Apple Swift 文档的副本:
As soon as all properties of the superclass have an initial value,
its memory is considered fully initialized, and Phase 1 is complete.
The superclass’s designated initializer now has an opportunity to
customize the instance further (although it does not have to).
Once the superclass’s designated initializer is finished, the
subclass’s designated initializer can perform additional customization
(although again, it does not have to).
基本上,第 1 阶段确保所有属性都有一个值并将该值分配给它们。在第 2 阶段,这些属性将进一步定制。进一步的定制让我很沮丧,因为我想不出一个使用进一步定制的例子。你能给我一个关于这种初始化行为的简单例子,或者提供关于第 1 阶段和第 2 阶段的额外解释吗?谢谢
例如,您想要一个始终为红色的 UIView
。 self.frame 在第 1 阶段设置(通过调用 [super initWithFrame:frame]
,您在 initWithFrame:
的实现中更改 self.backgroundColor
,这是第 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 类 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 实例或其超类上 "perform additional customizations" 的地方。这由 b = 2
和 c = 3
.
表示
let x = Bar()
x.a // 1
x.b // 2
x.c // 3
这样想。第一阶段非常有限。 All 它所做的是设置所有必需的 属性 值。在完成之前你不能做任何其他事情。
第一阶段不能引用self,也不能调用其他方法。这是非常有限的。
第 1 阶段完成后,您可以自由调用其他方法并引用 self。
您认为在 init 方法中发生的大部分代码都发生在阶段 2 中。
例如,如果您有一个管理网络连接的对象,则需要在第 2 阶段设置该网络连接。
我在 Swift 初始化中了解第一阶段和第二阶段的示例。
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"
}
}
阶段 1: 从 sub 开始到 super class,分配内存和初始化 属性
第 2 阶段: 继续从超级到次级 class,自定义
这是 Apple Swift 文档的副本:
As soon as all properties of the superclass have an initial value, its memory is considered fully initialized, and Phase 1 is complete.
The superclass’s designated initializer now has an opportunity to customize the instance further (although it does not have to).
Once the superclass’s designated initializer is finished, the subclass’s designated initializer can perform additional customization (although again, it does not have to).
基本上,第 1 阶段确保所有属性都有一个值并将该值分配给它们。在第 2 阶段,这些属性将进一步定制。进一步的定制让我很沮丧,因为我想不出一个使用进一步定制的例子。你能给我一个关于这种初始化行为的简单例子,或者提供关于第 1 阶段和第 2 阶段的额外解释吗?谢谢
例如,您想要一个始终为红色的 UIView
。 self.frame 在第 1 阶段设置(通过调用 [super initWithFrame:frame]
,您在 initWithFrame:
的实现中更改 self.backgroundColor
,这是第 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 类 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 实例或其超类上 "perform additional customizations" 的地方。这由 b = 2
和 c = 3
.
let x = Bar()
x.a // 1
x.b // 2
x.c // 3
这样想。第一阶段非常有限。 All 它所做的是设置所有必需的 属性 值。在完成之前你不能做任何其他事情。
第一阶段不能引用self,也不能调用其他方法。这是非常有限的。
第 1 阶段完成后,您可以自由调用其他方法并引用 self。
您认为在 init 方法中发生的大部分代码都发生在阶段 2 中。
例如,如果您有一个管理网络连接的对象,则需要在第 2 阶段设置该网络连接。
我在 Swift 初始化中了解第一阶段和第二阶段的示例。
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"
}
}
阶段 1: 从 sub 开始到 super class,分配内存和初始化 属性
第 2 阶段: 继续从超级到次级 class,自定义