Swift 中 struct 和 class 的区别是什么?

· 约 6 分钟读完 · 第 4 / 196 章

推荐答案

在 Swift 中,struct 和 class 的主要区别如下:

  1. 值类型 vs 引用类型:

    • struct 是值类型,赋值或传递时会复制整个实例。
    • class 是引用类型,赋值或传递时传递的是引用,多个变量可以指向同一个实例。
  2. 继承:

    • struct 不支持继承。
    • class 支持继承,允许子类继承父类的属性和方法。
  3. 内存管理:

    • struct 由编译器自动管理内存,通常存储在栈上。
    • class 使用引用计数(ARC)进行内存管理,通常存储在堆上。
  4. 可变性:

    • struct 的实例默认是不可变的,除非使用 mutating 关键字。
    • class 的实例是可变的,可以直接修改属性。
  5. 初始化器:

    • struct 会自动生成成员初始化器。
    • class 需要手动定义初始化器,除非所有属性都有默认值。

本题详细解读

1. 值类型 vs 引用类型

  • struct:当你在 Swift 中使用 struct 时,每次赋值或传递实例时,都会创建一个新的副本。这意味着修改一个实例不会影响其他实例。例如:

    在这个例子中,p1 和 p2 是两个独立的实例,修改 p2 不会影响 p1。

  • class:与 struct 不同,class 是引用类型。当你赋值或传递一个 class 实例时,传递的是对同一实例的引用。例如:

    在这个例子中,p1 和 p2 指向同一个实例,修改 p2 也会影响 p1。

2. 继承

  • struct:struct 不支持继承。你不能从一个 struct 派生出另一个 struct。这使得 struct 更适合用于简单的数据结构。

  • class:class 支持继承,允许你创建一个子类来继承父类的属性和方法。例如:

    在这个例子中,Dog 类继承了 Animal 类,并重写了 makeSound 方法。

3. 内存管理

  • struct:struct 是值类型,通常存储在栈上。栈上的内存分配和释放速度较快,且由编译器自动管理,不需要手动处理内存。

  • class:class 是引用类型,通常存储在堆上。Swift 使用自动引用计数(ARC)来管理 class 实例的内存。当没有强引用指向一个实例时,ARC 会自动释放该实例。

4. 可变性

  • struct:struct 的实例默认是不可变的。如果你需要在 struct 的方法中修改属性,必须使用 mutating 关键字。例如:

    在这个例子中,moveBy 方法使用了 mutating 关键字来修改 x 和 y 属性。

  • class:class 的实例是可变的,你可以直接修改其属性,而不需要任何特殊关键字。例如:

    在这个例子中,moveBy 方法直接修改了 x 和 y 属性。

5. 初始化器

  • struct:struct 会自动生成一个成员初始化器(memberwise initializer),允许你在创建实例时直接初始化所有属性。例如:

    在这个例子中,Point 结构体自动生成了一个初始化器,允许你直接传入 x 和 y 的值。

  • class:class 不会自动生成成员初始化器,除非所有属性都有默认值。你需要手动定义初始化器。例如:

    在这个例子中,Point 类需要手动定义初始化器来初始化 x 和 y 属性。