下面这段代码中指定初始化和便利初始化有什么区别

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 BA 的子 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