下面这段代码中指定初始化和便利初始化有什么区别
What the difference between designated and convenience init in this code below
代码分为两部分,在*.playground中的结果似乎是一样的,这让我有点困惑,那么下面这段代码中designated和convenience init到底有什么区别,我怎么知道我什么时候应该使用便利初始化而不是指定初始化?
第 1 部分
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]")
}
}
let food = Food()
let food2 = Food(name: "Rice")
第 2 部分
class Food {
var name: String
init(name: String) {
self.name = name
}
init() {
self.name = "[Unnamed]"
}
}
let food = Food()
let food2 = Food(name: "Rice")
第 1 部分和第 2 部分不同的部分是
//part 1
convenience init() {
self.init(name: "[Unnamed]")
}
//part 2
init() {
self.name = "[Unnamed]"
}
区别出现在subclasses;在您所展示的内容中,没有用法差异。
“便利初始化器必须始终委托”意味着在 class A
中便利初始化器调用 class A
中的指定初始化器。 “指定初始化器必须始终向上委托”意思是 class B
,A
的子 class,调用 A
.
中的指定初始化器
因此,在您的 'part 2' 中,Food
中的两个初始值设定项都可用于 Food
的子class。但是,在你的 'part 1' 中,子 class 中只能使用一个初始化器。
例如(下面的Food
是你的'part 1'):
21> class Fat : Food {
22. init () {
23. super.init()
24. }
25. }
repl.swift:23:9: error: must call a designated initializer of the superclass 'Food'
super.init()
^
引述如下:摘自:Apple Inc.“Swift 编程语言。”电子书。 https://itun.es/us/jEUH0.l
代码分为两部分,在*.playground中的结果似乎是一样的,这让我有点困惑,那么下面这段代码中designated和convenience init到底有什么区别,我怎么知道我什么时候应该使用便利初始化而不是指定初始化?
第 1 部分
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]")
}
}
let food = Food()
let food2 = Food(name: "Rice")
第 2 部分
class Food {
var name: String
init(name: String) {
self.name = name
}
init() {
self.name = "[Unnamed]"
}
}
let food = Food()
let food2 = Food(name: "Rice")
第 1 部分和第 2 部分不同的部分是
//part 1
convenience init() {
self.init(name: "[Unnamed]")
}
//part 2
init() {
self.name = "[Unnamed]"
}
区别出现在subclasses;在您所展示的内容中,没有用法差异。
“便利初始化器必须始终委托”意味着在 class A
中便利初始化器调用 class A
中的指定初始化器。 “指定初始化器必须始终向上委托”意思是 class B
,A
的子 class,调用 A
.
因此,在您的 'part 2' 中,Food
中的两个初始值设定项都可用于 Food
的子class。但是,在你的 'part 1' 中,子 class 中只能使用一个初始化器。
例如(下面的Food
是你的'part 1'):
21> class Fat : Food {
22. init () {
23. super.init()
24. }
25. }
repl.swift:23:9: error: must call a designated initializer of the superclass 'Food'
super.init()
^
引述如下:摘自:Apple Inc.“Swift 编程语言。”电子书。 https://itun.es/us/jEUH0.l