This commit is contained in:
2022-01-10 21:53:20 +08:00
parent 8bfc22c043
commit 2cbad07435
6 changed files with 296 additions and 24 deletions

View File

@@ -1,3 +1,72 @@
import UIKit
var greeting = "Hello, playground"
//class Animal {
// func speak() {
// print("Animal speak")
// }
// subscript(index: Int) -> Int {
// return index
// }
//}
//
//var anim: Animal
//anim = Animal()
//anim.speak()
//print(anim[6])
//
//class Cat: Animal {
// override func speak() {
// print("Cat speak")
// }
//
// override subscript(index: Int) -> Int {
// return super[index] + 1
// }
//}
//
//var cat = Cat()
//cat.speak()
//print(cat[6])
class Animal {
class func speak() {
print("Animal speak")
}
static subscript(index: Int) -> Int {
return index
}
}
class Cat: Animal {
override class func speak() {
super.speak()
print("Cat speak")
}
}
class Circle {
static var radius: Int = 0
class var diameter: Int {
set {
print("Circle setDiameter")
radius = newValue / 2
}
get {
print("Circle getDiameter")
return radius * 2
}
}
}
class SubCircle: Circle {
override class var diameter: Int {
set {
print("SubCircle setDiameter")
super.diameter = newValue > 0 ? newValue : 0
}
get {
print("SubCircle getDiameter")
return super.diameter
}
}
}

View File

@@ -0,0 +1,225 @@
### 继承Inheritance
值类型(枚举、结构体)不支持继承,只有类支持继承。
* 没有父类的类称为基类
* 子类可以重写父类的**下标**、**方法**、**属性**,重写必须加上 `override` 关键字
#### 重写实例方法、下标
```swift
class Animal {
func speak() {
print("Animal speak")
}
subscript(index: Int) -> Int {
return index
}
}
var anim: Animal
anim = Animal()
// Animal speak
anim.speak()
// 6
print(anim[6])
class Cat: Animal {
override func speak() {
super.speak()
print("Cat speak")
}
override subscript(index: Int) -> Int {
return super[index] + 1
}
}
var cat = Cat()
// Animal speak
// Cat speak
cat.speak()
// 7
print(cat[6])
```
#### 重写类型方法、下标
*`class` 修饰的类型方法、下标,允许被子类重写
*`static` 修饰的类型方法、下标,不允许被子类重写
```swift
class Animal {
// class 修饰的方法可以子类被重写
class func speak() {
print("Animal speak")
}
// static 修饰的方法不可以子类被重写
static subscript(index: Int) -> Int {
return index
}
}
class Cat: Animal {
override class func speak() {
super.speak()
print("Cat speak")
}
}
```
#### 重写属性
1. 子类可以将父类的属性(存储、计算)重写为 **计算属性**
2. 子类不可以将父类属性重写为 **存储属性**
3. 只能重写 `var` 属性,不能重写 `let` 属性
4. 重写时,属性名、类型要一致
5. 子类重写后的属性权限 **不能小于** 父类属性的权限
1. 如果父类属性是只读,那么子类重写后的属性可以是只读的,也可以是可读写的
2. 如果父类是可读写的,那么子类重写后的属性也必须是可读写的
##### 重写实例属性
```swift
class SubCircle : Circle {
override var radius: Int {
set {
print("SubCircle setRadius")
super.radius = newValue > 0 ? newValue : 0
}
get {
print("SubCircle getRadius")
return super.radius
}
}
override var diameter: Int {
set {
print("SubCircle setDiameter")
super.diameter = newValue > 0 ? newValue : 0
}
get {
print("SubCircle getDiameter")
return super.diameter
}
}
}
circle = SubCircle()
// SubCircle setRadius
circle.radius = 6
// SubCircle getDiameter
// Circle getDiameter
// SubCircle getRadius
// 12
print(circle.diameter)
// SubCircle setDiameter
// Circle setDiameter
// SubCircle setRadius
circle.diameter = 20
// SubCircle getRadius
// 10
print(circle.radius)
```
##### 重写类型属性
1.`class` 修饰的计算类型属性,可以被子类重写
2.`static` 修饰的类型属性(存储、计算),不可以被子类重写
```swift
class Circle {
static var radius: Int = 0
class var diameter: Int {
set {
print("Circle setDiameter")
radius = newValue / 2
}
get {
print("Circle getDiameter")
return radius * 2
}
}
}
class SubCircle: Circle {
override class var diameter: Int {
set {
print("SubCircle setDiameter")
super.diameter = newValue > 0 ? newValue : 0
}
get {
print("SubCircle getDiameter")
return super.diameter
}
}
}
```
#### 属性观察器
可以在子类中为父类属性除了只读计算属性、let属性增加属性观察器
```swift
class Circle {
// 父类是存储属性
var radius: Int = 1
}
class SubCircle : Circle {
override var radius: Int {
willSet {
print("SubCircle willSetRadius", newValue)
}
didSet {
print("SubCircle didSetRadius", oldValue, radius)
}
}
}
var circle = SubCircle()
// SubCircle willSetRadius 10
// SubCircle didSetRadius 1 10
circle.radius = 10
```
```swift
class Circle {
// 父类存储属性也有属性观察器
var radius: Int = 1 {
willSet {
print("Circle willSetRadius", newValue)
}
didSet {
print("Circle didSetRadius", oldValue, radius)
}
}
}
class SubCircle : Circle {
override var radius: Int {
willSet {
print("SubCircle willSetRadius", newValue)
}
didSet {
print("SubCircle didSetRadius", oldValue, radius)
}
}
}
var circle = SubCircle()
// SubCircle willSetRadius 10
// Circle willSetRadius 10
// Circle didSetRadius 1 10
// SubCircle didSetRadius 1 10
circle.radius = 10
```
#### final
`final` 修饰的方法、下标、属性,禁止被重写
`final` 修饰的类,禁止被继承

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='5.0' target-platform='ios' buildActiveScheme='true' executeOnSourceChanges='false' importAppTypes='true'>
<playground version='5.0' target-platform='ios' buildActiveScheme='true' importAppTypes='true'>
<timeline fileName='timeline.xctimeline'/>
</playground>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Timeline
version = "3.0">
<TimelineItems>
</TimelineItems>
</Timeline>

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>13 继承 (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>