Swift学习笔记(三)

继承

一个类可以继承(inherit)另一个类的方法(methods),属性(properties)和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。
在 Swift 中,类可以调用和访问超类的方法,属性和下标(subscripts),并且可以重写(override)这些方法,属性和下标来优化或修改它们的行为。Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确保你的重写行为是正确的。


父类

不继承于其它类的类,称之为基类(base class)。注意:Swift 中的类并不是从一个通用的基类继承而来。如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。

这里的控制器继承于UIViewController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import UIKit

class HappinessViewController: UIViewController, FaceViewDataSource {
......
var happiness: Int = 10 {
didSet{
happiness = min(max(happiness, 0), 100)
print("happiness = \(happiness)")
updateUI()
}
}

private func updateUI() {
faceView?.setNeedsDisplay()
title = "\(happiness)"
}

func smilinessForFaceView(sender: FaceView) -> Double? {
return Double(happiness - 50)/50
}


子类

子类生成(Subclassing)指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以进一步完善。你还可以为子类添加新的特性。

1
2
3
4
5
6
7
8
9
10
import UIKit

class DianosedHappinessViewController: HappinessViewController, UIPopoverPresentationControllerDelegate{
override var happiness: Int{
//先执行父类didSet,后执行子类的didSet。不会覆盖
didSet{
dianosticHistory += [happiness]
}
}
····

方法

方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Objective-C 中的类方法(class methods)相似。
结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。在 Objective-C 中,类是唯一能定义方法的类型。但在 Swift 中,你不仅能选择是否要定义一个类/结构体/枚举,还能灵活地在你创建的类型(类/结构体/枚举)上定义方法。

定义运算方法

1
2
3
4
5
6
7
8
9
10
11
12
//压入栈函数
func pushOperand(operand: Double) -> Double?{
opStack.append(Op.Operand(operand))
return evaluate()
}
//传入运算符,执行运算
func performOperation(symbol: String) -> Double?{
if let operation = knownOps[symbol]{
opStack.append(operation)
}
return evaluate()
}

调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//运算
@IBAction func operate(sender: UIButton) {

if userIsInTheMiddleOfTypingANumber {
enter()
}

if let operation = sender.currentTitle {
if let result = brain.performOperation(operation){
displayValue = result
} else{
displayValue = 0
}
}

}
@IBAction func enter() {
userIsInTheMiddleOfTypingANumber = false
if let result = brain.pushOperand(displayValue){
displayValue = result
} else{
displayValue = 0
}
}


构造过程

构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置实例中每个存储型属性的初始值和执行其他必须的设置或初始化工作。
通过定义构造器(Initializers)来实现构造过程,这些构造器可以看做是用来创建特定类型新实例的特殊方法。与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。

1
2
3
4
5
6
7
8
9
//定义字典,key为运算符,value为Op,即运算方法
private var knownOps = Dictionary<String, Op>()
init() {
knownOps["×"] = Op.BinaryOperation("×", *)
knownOps["÷"] = Op.BinaryOperation("÷") {$1 / $0}
knownOps["-"] = Op.BinaryOperation("-") {$1 - $0}
knownOps["+"] = Op.BinaryOperation("+", +)
knownOps["√"] = Op.UnaryOperation("√", sqrt)
}

其他

最后展示截止到课时7,demo效果图。附上代码的github连接:https://github.com/xayoung/CS193P-DemoCode
此处输入图片的描述