Swift(六) 类和结构体

类和结构体

区别

相同点

  • 定义属性用于存储值
  • 定义方法用于提供功能
  • 定义附属脚本用于访问
  • 定义构造器用于生成初始化
  • 通过扩展以增加默认实现的
  • 实现协议以提供某种标准功能

不同点(类多了以下特点)

  • 继承允许一个类继承另一个类的特征
  • 类型转换允许在运行时检查和解释一个类实例的类型
  • 解构器允许一个类实例释放任何其所被分配的资源
  • 引用计数允许对一个类的多次引用

定义

1
2
3
4
5
6
class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}

结构体逐一成员构造器

1
2
3
4
5
6
struct Resolution {
var width = 0
var height = 0
}

let vga = Resolution(width: 100, height: 100)

结构体和枚举都是值类型

值类型和引用类型

Swift 的类型分为值类型和引用类型两种,值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个 “指向”。

Swift 中的所有的内建类型都是值类型(Int, Bool, Array, String, Dictionary)

值类型的一个特点是在传递和赋值时进行复制,每次复制肯定会产生额外开销,但是在 Swift 中这个消耗被控制在了最小范围内,在没有必要复制的时候,值类型的复制都是不会发生的

简单的赋值,参数的传递等等普通操作,虽然我们可能用不同的名字来回设置和传递值类型,但是在内存上它们都是同一块内容

1
2
3
4
5
>var a = [1, 2, 3]
var b = a
a.removeAtIndex(0)
// 此时 ab的内存地址不在相同
>

恒等运算符

===

判断两个常量或变量是否指向同一个对象

继承

1
2
3
class SomeClass: SomeSuperclass {
// 这里是子类的定义
}

重写(overriding)

swift 中可以重写继承来的实例方法,类方法,实例属性,下标脚本, 需加 override 关键字。

1
2
3
4
5
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}

重写方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

class Vehicle {

var currentSpeed = 0.0
var desc : String {

return "traveling at \(currentSpeed) miles per hour"
}

func makeNoise() {

}

final var maxSpeed = 100
}

class Bicycle: Vehicle {

var hasBasket = false // 有一个篮子

override func makeNoise() {

print("bicycle make noise")
}
}

重写属性

重写属性时,必需将它的名字和类型都写出来
可以将继承来的只读属性重写为读写属性, 但是不可将一个继承来得读写属性重写为只读属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//双人自行车
class Tandem: Bicycle {

var currentNumbersOfPassengers = 2 //

var tandemDesc = ""

// 可以将继承来的只读属性重写为读写属性, 但是不可将一个继承来得读写属性重写为只读属性
override var desc: String {

get {
return super.desc
}
set {

tandemDesc = newValue
}
}
}

重写属性观察器

不可为常量或只读计算属性添加属性观察器, 这些属性不可被设置。

不可同时提供setter和属性观察器。

1
2
3
4
5
6
7
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}

防止重写

final关键字

在关键字class前添加final修饰符(final class)来将整个类标记为 final 的