banner
NEWS LETTER

Swift 中 struct 和 class 的区别

Scroll down

#Swift

Swift,作为一个面向对象语言,也是有 class 关键字的。
但是不同于Java,C# 等语言,它的 class 似乎并不是很常用(?
而在SwiftUI中,class的功能似乎被 struct 取代——行使和 class 相似的功能,但是我还是时常不清楚二者的区别。所以在此总结一下😋。
——部分解答参考了Google Gemini给出的回答,如有错误,请务必及时指出!欧内盖!

Swift 中的 structclass 都是用来定义自定义数据类型的,它们之间有许多相似之处,但也有一些关键的区别。

值类型与引用类型

最大的区别在于 struct 是值类型,而 class 是引用类型。这意味着:

  • 值类型:将一个值类型变量赋值给另一个变量时,会将该值的副本赋值给另一个变量。因此,对其中一个变量的更改不会影响另一个变量。
  • 引用类型:将一个引用类型变量赋值给另一个变量时,只会将该变量对对象的引用赋值给另一个变量。因此,对其中一个变量的更改会影响另一个变量。

示例

1
2
3
4
5
6
7
8
9
10
11
12
struct Point {
var x: Int
var y: Int
}

var a = Point(x: 1, y: 2)
var b = a

b.x = 3

print(a.x) // 1
print(b.x) // 3

在这个例子中,Point 就是一个值类型。因此,将 a 赋值给 b 时,会将 a 的值复制给 b。在这之后,如果对 b.x 做更改, a.x 的值不会受到影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person {
var name: String
var age: Int

init(name: String, age: Int) {
self.name = name
self.age = age
}
}

var c = Person(name: "John", age: 30)
var d = c

d.age = 31

print(c.age) // 31
print(d.age) // 31

在这个例子中,Person 是一个引用类型。因此,将 c 赋值给 d 时,只会将 c 对对象的引用赋值给 d。在这之后,如果对 d.age 的值做出更改,c.age 的值也会受到影响。

其他区别

  • 继承:class 可以继承自另一个 class,而 struct 不能。
  • 初始化:struct 有默认的成员初始化器,而 class 没有。
  • 可变性:struct 实例默认是不可变的,而 class 实例是可变的。
  • 类型转换:class 实例可以进行类型转换,而 struct 实例不能。

选择使用 struct 还是 class
一般来说,如果不需要继承或类型转换,并且希望使用值语义,则应使用 struct。如果需要继承或类型转换,或者需要可变实例,则应使用 class。

以下是一些使用 struct 和 class 的示例:

  • 使用 struct 表示简单的数据值,例如点、大小或颜色。
  • 使用 struct 表示不可变的数据,例如日期或时间。
  • 使用 class 表示复杂的数据结构,例如用户或文档。
  • 使用 class 表示需要继承的数据结构,例如视图控制器或网络请求。
Other Articles
cover
CPT103-L2-SQL
  • 24/03/05
  • 12:41
  • 2.4k
Article table of contents TOP
  1. 1. 值类型与引用类型
    1. 1.1. 示例
    2. 1.2. 其他区别
Please enter keywords to search