From 30fc64948dc65473b4623cebefa999df29b522b1 Mon Sep 17 00:00:00 2001 From: jiulinxiri Date: Thu, 13 Jan 2022 10:53:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 13 继承.playground/Resources/README.md | 7 +- .../UserInterfaceState.xcuserstate | Bin 14509 -> 14529 bytes 14 初始化.playground/Contents.swift | 104 +++++++++++ 14 初始化.playground/Resources/README.md | 175 ++++++++++++++++++ 14 初始化.playground/contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 14914 bytes 7 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 14 初始化.playground/Contents.swift create mode 100644 14 初始化.playground/Resources/README.md create mode 100644 14 初始化.playground/contents.xcplayground create mode 100644 14 初始化.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 14 初始化.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/13 继承.playground/Resources/README.md b/13 继承.playground/Resources/README.md index 781188a..8d7c433 100644 --- a/13 继承.playground/Resources/README.md +++ b/13 继承.playground/Resources/README.md @@ -222,4 +222,9 @@ circle.radius = 10 被 `final` 修饰的方法、下标、属性,禁止被重写 -被 `final` 修饰的类,禁止被继承 \ No newline at end of file +被 `final` 修饰的类,禁止被继承 + +#### 多态 + +父类引用指向子类对象 + diff --git a/13 继承.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate b/13 继承.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate index 4fca9643557d94fadc7033e48792fb56e8a1bf42..a645b8ad2aba6ac64e1c7e809cf6673aa28aca2d 100644 GIT binary patch delta 3859 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 Y-r)Y=!B5{P7=OCM<4^aJYcT)+03XS*5&!@I diff --git a/14 初始化.playground/Contents.swift b/14 初始化.playground/Contents.swift new file mode 100644 index 0000000..25c2898 --- /dev/null +++ b/14 初始化.playground/Contents.swift @@ -0,0 +1,104 @@ +import UIKit + +// 类的属性有初始值的时候,默认会有一个 init() 的初始化器 +//class Size { +// var width: Int = 0 +// var height: Int = 0 +//} + +// 等价于 +//class Size { +// var width: Int +// var height: Int +// +// init() { +// width = 0 +// height = 0 +// } +//} + + +class Size { + var width: Int = 0 + var height: Int = 0 + + // 指定初始化器(主要初始化器) + // 用户指定完初始化器之后,会覆盖掉原来的 init()初始化器 + init(width: Int, height: Int) { + self.width = width + self.height = height + } + + // 便捷初始化器 + convenience init(width: Int) { + self.init(width: width, height: 0) + } +} + +var s1 = Size(width: 10, height: 20) +var s2 = Size(width: 30) + + +class Person { + var age: Int + // 指定初始化器 + init(age: Int) { + self.age = age + } + // 便捷初始化器 + convenience init() { + self.init(age: 0) + } +} + +class Student: Person { + var score: Int + // 指定初始化器调用直系父类的初始化器 + init(age: Int, score: Int) { + self.score = score + // super.init 方法放到最后 + super.init(age: age) + } + + // 便捷初始化器调用便捷初始化器 + convenience init() { + self.init(score: 0) + } + + // 便捷初始化器调用指定初始化器 + convenience init(score: Int) { + self.init(age: 0, score: score) + } +} + + +class Animal { + var legs: Int + var name: String + var age: Int + + init(name: String, age: Int, legs: Int) { + self.legs = legs + self.age = age + self.name = name + } + + init(name: String, age: Int) { + self.legs = 4 + self.age = age + self.name = name + } + + convenience init(name: String) { + self.init(name: name, age: 1, legs: 4) + } +} + +class Cat: Animal { + +} + +var cat = Cat(name: "淘气", age: 3, legs: 4) +var cat1 = Cat(name: "淘气", age: 3) +var cat2 = Cat(name: "淘气") + diff --git a/14 初始化.playground/Resources/README.md b/14 初始化.playground/Resources/README.md new file mode 100644 index 0000000..d2b403b --- /dev/null +++ b/14 初始化.playground/Resources/README.md @@ -0,0 +1,175 @@ +--- +gitea: none +include_toc: true +--- + +### 初始化器 + +类、结构体、枚举都可以定义初始化器。类的两种初始化器如下所示 + +* 指定初始化器(designated initializer) +* 便捷初始化器(convenience initializer): 便捷初始化器的前边有 `convenience` 关键字,只能进行当前类横向调用。 + +```swift +// 类的属性有初始值的时候,默认会有一个 init() 的初始化器 +class Size { + var width: Int = 0 + var height: Int = 0 +} + +// 等价于 +class Size { + var width: Int + var height: Int + // 指定初始化器 + init() { + width = 0 + height = 0 + } +} + +class Size { + var width: Int = 0 + var height: Int = 0 + + // 指定初始化器(主要初始化器) + // 用户指定完初始化器之后,会覆盖掉原来的 init()初始化器 + init(width: Int, height: Int) { + self.width = width + self.height = height + } + + // 便捷初始化器 + convenience init(width: Int) { + self.init(width: width, height: 0) + } +} +var s1 = Size(width: 10, height: 20) +var s2 = Size(width: 30) +``` + +#### 类初始化器 + +1. 每个类至少有一个指定初始化器,指定初始化器是类的主要初始化器 +2. 默认初始化器总是类的指定初始化器 +3. 类偏向于少量指定初始化器,一个类通常只有一个指定初始化器 + + + +#### 初始化器的相互调用 + +1. 指定初始化器必须从它的直系父类调用指定初始化器 +2. 便捷初始化器必须从相同的类里调用另一个初始化器 +3. 便捷初始化器最终必须调用一个指定初始化器 + +```swift +class Person { + var age: Int + // 指定初始化器 + init(age: Int) { + self.age = age + } + // 便捷初始化器 + convenience init() { + self.init(age: 0) + } +} + +class Student: Person { + var score: Int + // 指定初始化器调用直系父类的初始化器 + init(age: Int, score: Int) { + self.score = score + // super.init 方法放到最后 + super.init(age: age) + // 个性化定制代码 + ... + } + + // 便捷初始化器调用便捷初始化器 + convenience init() { + self.init(score: 0) + } + + // 便捷初始化器调用指定初始化器 + convenience init(score: Int) { + self.init(age: 0, score: score) + } +} +``` + +初始化器的调用规则如下图所示 + +image-20220113091257659 + + + +#### 两段式初始化 + +第1阶段:初始化所有存储属性 + +* 外层调用指定\便捷初始化器 +* 分配内存给实例,但未初始化 +* 指定初始化器确保当前类定义的存储属性都初始化 +* 指定初始化器调用父类的初始化器,不断向上调用,形成初始化器链 + +第2阶段:设置新的存储属性值 + +* 从顶部初始化器往下,链中的每一个指定初始化器都有机会进一步定制实例 +* 初始化器现在能够使用self(访问、修改它的属性,调用它的实例方法等等) +* 最终,链中任何便捷初始化器都有机会定制实例以及使用self + + + +#### 重写 + +初始化器的重写,即子类重写父类的初始化器方法。 + +* 当重写父类的指定初始化器时,必须加上 `override`(即使子类的实现是便捷初始化器) +* 如果子类写了一个匹配父类便捷初始化器的初始化器,不用加上 `override` + * 因为父类的便捷初始化器永远不会通过子类直接调用 + +#### 自动继承 + +①如果子类没有自定义任何指定初始化器,它会自动继承父类所有的指定初始化器。 + +```swift +class Animal { + var legs: Int + var name: String + var age: Int + + init(name: String, age: Int, legs: Int) { + self.legs = legs + self.age = age + self.name = name + } + + init(name: String, age: Int) { + self.legs = 4 + self.age = age + self.name = name + } + + convenience init(name: String) { + self.init(name: name, age: 1, legs: 4) + } +} + +class Cat: Animal { + +} +// Cat 继承父类所有的指定初始化器 +var cat = Cat(name: "淘气", age: 3, legs: 4) +var cat1 = Cat(name: "淘气", age: 3) +// 子类自动继承所有的父类便捷初始化器 +var cat2 = Cat(name: "淘气") +``` + +②如果子类提供了父类所有指定初始化器的实现(要么通过方式①继承,要么重写) + +* 子类自动继承所有的父类便捷初始化器 + +③就算子类添加了更多的便捷初始化器,这些规则仍然适用 + +④子类以便捷初始化器的形式重写父类的指定初始化器,也可以作为满足规则②的一部分 diff --git a/14 初始化.playground/contents.xcplayground b/14 初始化.playground/contents.xcplayground new file mode 100644 index 0000000..cf026f2 --- /dev/null +++ b/14 初始化.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/14 初始化.playground/playground.xcworkspace/contents.xcworkspacedata b/14 初始化.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ca3329e --- /dev/null +++ b/14 初始化.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14 初始化.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate b/14 初始化.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..2cd16502e38c406ea0c0c5067f3f87aeedd94050 GIT binary patch literal 14914 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 f>)h{rz