From e4f6866cbcc185abe9a298d56975ca9b26465d53 Mon Sep 17 00:00:00 2001 From: AceVest Date: Thu, 16 Mar 2017 23:46:35 +0800 Subject: [PATCH] Swift - Initialization --- .../Contents.swift | 160 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 23829 -> 23809 bytes 2 files changed, 160 insertions(+) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift index a7ddf9f..cae7fb1 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift @@ -173,4 +173,164 @@ print("CenterRect: \(centerRect.description)") // 类的继承和构造过程 +// 每一个类都必须拥有至少一个指定构造器 +// 应当只在必要的时候为类提供便利构造器 +// 指定构造器语法 +// init(parameters) { +// statements +// } + +// 便利构造器语法 +// convenience init(parameters) { +// statements +// } + + +// 构造器之间的代理规则 +// 1. 指定构造器必须调用其直接父类的的指定构造器 +// 2. 便利构造器必须调用同类中定义的其它构造器 +// 3. 便利构造器必须最终导致一个指定构造器被调用 + + +// 换种说法 +// 1. 指定构造器必须总是向上代理 +// 2. 便利构造器必须总是横向代理 + + + +// +// 两段式构造安全检查 +// +// 需要注意`初始化` 和 `赋新值`之间的细微差别 +// 1. 指定构造器必须保证它所在类引入的所有属性都必须先`初始化`完成 +// 2. 指定构造器必须先向上代理调用父类构造器,然后再为继承的属性`赋新值` +// 3. 便利构造器必须先代理调用同一类中的其它构造器,然后再为任意属性赋新值 +// 4. 构造器在第一阶段构造完成之前,不能调用任何实例方法,不能读取任何实例属性的值,不能引用self作为一个值 + + +// +// 阶段 1 +// +// 某个指定构造器或便利构造器被调用。 +// 完成新实例内存的分配,但此时内存还没有被初始化。 +// 指定构造器确保其所在类引入的所有存储型属性都已赋初值。存储型属性所属的内存完成初始化。 +// 指定构造器将调用父类的构造器,完成父类属性的初始化。 +// 这个调用父类构造器的过程沿着构造器链一直往上执行,直到到达构造器链的最顶部。 +// 当到达了构造器链最顶部,且已确保所有实例包含的存储型属性都已经赋值,这个实例的内存被认为已经完全初始化。此时阶段 1 完成。 + +// +// 阶段 2 +// +// 从顶部构造器链一直往下,每个构造器链中类的指定构造器都有机会进一步定制实例。构造器此时可以访问self、修改它的属性并调用实例方法等等。 +// 最终,任意构造器链中的便利构造器可以有机会定制实例和使用self + + + +// Swift 中的子类默认情况下不会继承父类的构造器 +// 父类的构造器仅会在安全和适当的情况下被继承 +// 在编写一个和父类中指定构造器相匹配的子类构造器时,实际上是在重写父类的这个指定构造器。因此必须在定义子类构造器时带上override修饰符 +// 如果编写了一个和父类便利构造器相匹配的子类构造器,由于子类不能直接调用父类的便利构造器,因此并不算子类重写父类构造器。所以不需要加override前缀 + + + +// Vehicle 只为存储属性提供默认值,而不自定义构造器 +// 因此它会自动获得一个默认构造器 +class Vehicle { + var numberOfWheels = 0 + var description: String { + return "\(numberOfWheels) wheel(s)" + } +} + +let someVehicle = Vehicle() +print("SomeVehicle: \(someVehicle.description)") + +class Bicycle: Vehicle { + override init() { // 重写默认构造器 + + super.init() // 调用父类默认构造器 + + numberOfWheels = 2 // 赋新值 + } +} + +let someBicycle = Bicycle() +print("SomeBicycel: \(someBicycle.description)") + + + + + +// 构造器的自动继承 +// 规则1: 如果子类没有定义任何`指定构造器`,它将自动继承所有父类的指定构造器。 +// 规则2: 如果子类提供了所有父类指定构造器的实现——无论是通过规则1继承过来的,还是提供了自定义实现——它将自动继承所有父类的`便利构造器` +// 注意: +// 1. 即使你在子类中添加了更多的便利构造器,这两条规则仍然适用。 +// 2. 对于规则2,子类可以将父类的指定构造器实现为便利构造器。 + + + +class Food { + var name: String + + // 指定构造器 + init(name: String) { + self.name = name + } + + // 便利构造器 + convenience init() { + self.init(name: "[Unnamed]") + } +} + + +let namedMeat = Food(name: "Bacon") + + +class RecipeIngredient: Food { // 食谱 材料 <==> 食材 + var quantity: Int + + init(name: String, quantity: Int) { + self.quantity = quantity + + super.init(name: name) + } + + // 重写父类的指定构造器,可以改写成便利构造器 + override convenience init(name: String) { + + // 便利构造器只允许调用本类的构造器 + self.init(name: name, quantity: 1) + } + + + // 由于RecipeIngredient类实现了父类Food的所有指定构造器 + // 因此它自动继承了父类Food的所有便利构造器 + // 在这个例子中是继承了 + // convenience init() { + // self.init(name: "[Unnamed]") + // } + // 只不过继承的这个便利构造器代理的不是Food,而是RecipeIngredient这个类 + // 因此self指的不是Food而是RecipeIngredient + + var description: String { + return "RecipeIngredient: \(self.name) x \(self.quantity)" + } +} + +// 因此有三种方式创建RecipeIngredient的实例 + +// 1. 调用将父类指定构造器重写为便利构造器的构造器 +let oneBacon = RecipeIngredient(name: "Bacon") +print("OneBacon: \(oneBacon.description)") + +// 2. 调用新写的指定构造器 +let sixEggs = RecipeIngredient(name: "Egg", quantity: 6) +print("SixEggs: \(sixEggs.description)") + +// 3. 调用继承自父类的便利构造器 +// 需要注意的是此时的构造器代理的不是父类而是当前类 +let oneMysterItem = RecipeIngredient() +print("OneMysterItem: \(oneMysterItem.description)") diff --git a/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate b/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate index ed698a8a9ea0ad1be45cd5768644ae5085823739..865a7a845c1dd81cba79be1c02a3fd3b147b2ecb 100644 GIT binary patch delta 8770 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 NxlN