Jiahonzheng's Blogs

Struct vs Class in Swift

字数统计: 519阅读时长: 2 min
2020/06/24 Share

值类型与引用类型

struct 是值类型,在赋值给新变量时,是值传递的,会发生复制操作。class 是引用类型,赋值时未发生复制操作。

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

let sr1 = SRound(radius: 2)
print("sr1.radius is \(sr1.radius!)")

var sr2 = SRound()
sr2.radius = 4
print("sr2.radius is \(sr2.radius!)")

var sr3 = sr2
sr2.radius = 100
print("sr2.radius is \(sr2.radius!)")
print("sr3.radius is \(sr3.radius!)")

上述程序输出结果如下。

1
2
3
4
sr1.radius is 2
sr2.radius is 4
sr2.radius is 100
sr3.radius is 4

继承

struct继承特性,class继承特性。

1
2
3
4
5
6
7
8
struct SRound {
var radius:Int?
}

// 提示 Inheritance from non-protocol type 'SRound' 编译错误
struct SubSRound: SRound {

}

构造函数

  • struct 中存在 Optional 成员时,编译器会自动构造全员构造函数。
  • struct 中所有成员均为 Optional 时,可使用简单构造函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct SRound {
var radius:Int?
var width:Int
}

// 当 struct 存在可选成员时,编译器自动生成的全员构造函数
let sr1 = SRound(radius: 2, width: 2)

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

// 当 struct 所有成员均为可选类型时,可使用简单构造函数
var sr2 = SRound2()
sr2.radius = 1

let 常量修饰符

使用 let 修饰的 struct 变量无法修改其成员变量,而同样使用 let 修饰的 class 变量可修改其成员变量。

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

let sr1 = SRound(radius: 1)
// 提示 Cannot assign to property: 'sr1' is a 'let' constant 编译错误
sr1.radius = 2

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

let cr1 = CRound(radius: 1)
// 无任何编译错误
cr1.radius = 2

mutating 修饰符

struct 的方法中,如果要修改成员变量的值,需要添加 mutating 修饰符,而 class 无此限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct SRound {
var radius:Int?
// 若不添加 mutating 修饰符,会提示以下编译错误:
// Cannot assign to property: 'self' is immutable
mutating func changeRadius(radius:Int) {
self.radius = radius
}
}

class CRound {
var radius:Int?
init(radius:Int?) {
self.radius = radius
}
// class 无需且不能添加 mutating 修饰符,添加后会提示以下编译错误:
// 'mutating' isn't valid on methods in classes or class-bound protocols
func changeRadius(radius:Int) {
self.radius = radius
}
}
CATALOG
  1. 1. 值类型与引用类型
  2. 2. 继承
  3. 3. 构造函数
  4. 4. let 常量修饰符
  5. 5. mutating 修饰符