Swift 中 Class 和 Struct 的区别 (类和结构体)

在 Swift 中,Apple 是大力提倡结构体的, 很多基本的单元都变成了结构体。 比如 Int, 在 OC 中是基本数值类型, 在 Swift 中变成了结构体。

1. 结构体是值类型,类是引用类型

Struct is value type while class is reference type.

1
2
3
4
5
6
7
8
9
10
11
12
13
struct SRound {
var radius:Int?
}

let sr1 = SRound(radius: 2)
var sr2 = SRound()
sr2.radius = 4
print("sr1.radius is \(sr1.radius!)\nsr2.radius is \(sr2.radius!)\n")

var sr3 = sr2
sr2.radius = 100
print("sr2.radius is \(sr2.radius!)\nsr3.radius is \(sr3.radius!) ")
复制代码

输出结果为

1
2
3
4
5
6
7
sr1.radius is 2
sr2.radius is 4

sr2.radius is 100
sr3.radius is 4

复制代码

将值类型(Value Type)赋值给新的变量时,是值传递的,也就是 copy 一份给了新变量。 上例中,sr2 结构体中,在 sr2 赋值给 sr3 时,sr2.radius 是 4,sr3 是一份全新的跟 sr2 一样的 struct。 当 sr2 被改变时,并不能印象 sr3。这也是值传递的本质。

相反地,class 在赋值的时候则是引用传递(类似 OC 中指针传递)。

2.Struct(结构体) 没有继承特性

3.Class 需要自己构建 constructor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct SRound {
var radius:Int?
var width:Int
}

let sr1 = SRound(radius: 2, width: 2) //自动生成的contructor

class CRound {
var radius:Int?
init(radius:Int?) { //自己构建的constructor
self.radius = radius
}
}

let cr1 = CRound(radius: 3)
复制代码

当 Struct 中有成员不是可选型,该结构体的构建方法就必须包括所有成员参数及全员构造器,该构造器是默认生成的,只有所有成员都为可选型,可直接简单构造,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct SRound {
var radius:Int?
var width:Int
}

let sr1 = SRound(radius: 2, width: 2)

struct SRound2 {
var radius:Int?
var width:Int?
}

var sr2 = SRound2()
sr2.radius = 1
复制代码

4.Struct 改变内容受修饰符 let 影响,Class 不受影响

let 修饰的 struct 无法被改变,遵循变量修饰符 let 的通常用法,但 let 的此效果无法作用到 class 上

5.Struct 方法的 mutating 修饰符

当 struct 方法中需要修改自身 property 时,方法需要前缀修饰符 mutating

修正如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct SRound {
var radius:Int?
var width:Int
}

extension SRound {
mutating func changeRadius(radius:Int) {
self.radius = radius
}
}

class CRound {
var radius:Int?
init(radius:Int?) {
self.radius = radius
}
}

extension CRound {
func changeRadius(radius:Int) {
self.radius = radius
}
}
复制代码
------本文结束 感谢阅读------

本文地址:https://www.kaaaaai.cn/class-and-struct-in-swift.html
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!

众筹项目:拯救世界!
0%