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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 -- 2.47.0