Swift 中类和结构体有什么区别?


本指南将介绍 Swift 编程语言中的类和函数。此外,它们之间有什么区别?

大多数情况下,当我们在项目中编写代码时,必须处理类和结构体。确实,这两个特性在 Swift 中是最重要的。在实时应用程序中,无论您想编写什么,都需要创建一个类来分配职责。

如果我们已经有类选项,我们需要了解为什么以及何时应该使用结构体。

结构体是 Swift 语言中的一个基本概念,它们可以帮助使您的代码更易于重用、更灵活且耦合性更低。此外,它们还有助于提高您作为应用程序开发人员的技能。如何做到这一点?让我们来看看。

首先,我们应该了解类和结构体的共同特征:

我们可以在两者中都以属性(变量和常量)的形式存储信息。

  • 两者都可以定义函数来执行某些任务。

  • 两者都可以根据协议实现。

  • 我们都可以为两者创建扩展。

  • 我们可以定义初始化器来设置属性。

类具备但结构体不具备的功能

  • 您可以通过继承父类来创建子类。

  • 您可以在类上执行 **deinit()** 操作。这意味着类可以被反初始化。

  • 类是引用类型。

我们应该何时使用结构体?

Swift 中的结构体在各种情况下都很有用。以下是:

  • 简单数据类型

    如果您不需要在对象之间建立复杂的关系,则应该使用结构体。这意味着,当您必须在代码中传递没有依赖关系的对象时,使用结构体更简单。

  • 不需要继承

    我们知道结构体不支持继承。基于此,您有一个简单的场景,您应该在代码中使用结构体。显然,当您不需要继承时,使用结构体更简单。

  • 线程安全

    代码中许多内容都在不同的线程上运行。当实例被共享并可从多个线程访问时,可能会出现死锁或竞争条件。在这种情况下,结构体是线程安全的。

  • 主要结构化场景

    创建类或结构体的目的是存储信息和执行操作。我们大多需要有关值类型的信息,例如 String、Int、Boolean 等。显然,结构体在这种情况下最合适。

我们应该何时使用类?

我们知道类有一些结构体没有的基本特征:

  • 类可以从另一个类继承,而结构体则不能。使用类,您可以编写类 **MyViewController** - **UIViewController** 来创建 UIViewController 的子类。虽然结构体可以实现协议,可以扩展,并且可以与泛型一起使用!

  • 类可以 **反初始化**,即可以实现 deinit 函数。此外,您可以对同一个类进行一个或多个引用(即类是引用类型)。

  • 类具有内置的身份概念,因为它们是引用类型。使用身份运算符 ===,您可以检查两个引用(变量、常量、属性等)是否引用同一个对象。

  • 如果要进行 Swift 和 Objective-C 之间的互操作,请使用类。如果需要 Objective-C 互操作性,则需要使用类。例如,如果要在 Realm 数据模型中使用 @objc 和 dynamic,则该模型需要是类。

让我们通过示例了解类和结构体的区别:

示例

class StudentClass {
   var name: String
   var grade: Int
   init(name: String, grade: Int) {
      self.name = name
      self.grade = grade
   }
}
let student1 = StudentClass(name: "Ramesh Chandra", grade: 9)
let student2 = student1
student2.name = "Ramesh Kant"
print("student1 name: \(student1.name)")
print("student2 name: \(student2.name)")

struct StudentStruct {
   var name: String
   var grade: Int
}
let student3 = StudentStruct(name: "Anish Sharma", grade: 8)
var student4 = student3
student4.name = "Anish Gupta"
print("student3 name: \(student3.name)")
print("student4 name: \(student4.name)")

输出

student1 name: Ramesh Kant
student2 name: Ramesh Kant
student3 name: Anish Sharma
student4 name: Anish Gupta

解释

在上面的示例中,我们创建了一个名为 **StudentClass** 的类和一个名为 **StudentStruct** 的结构体。现在您需要了解以下几点:

  • 结构体默认提供初始化器,而类需要我们手动定义。

  • 实例(student1 和 student2)是常量,即使属性发生更改也不需要是变量。

  • 对于结构体,我们使 student3 为常量,因为不需要更改任何属性。但是,另一个名为 student4 的对象是变量,因为我们必须更改属性。

  • 最后,您可以看到输出。很明显,类对象共享内存位置,这就是为什么类的另一个实例能够反映更改的原因。

类和结构体的区别

总结类和结构体的区别

比较 结构体
类型 类是引用类型。 结构体是值类型。
继承 类具有继承性,允许一个类继承另一个类的特性。 结构体不支持继承。
存储 类实例存储在堆上。 结构体属性存储在栈上。
初始化器 我们必须手动定义初始化器。 结构体自动获得默认初始化器。
线程安全 类不是完全线程安全的。 结构体始终是线程安全或单例的。

结论

您了解了何时使用类和结构体。基于此,您可以决定打算使用哪一个。

继承是类和结构体之间最显著的区别。使用类,您可以清楚地定义子类和父类之间的父子关系。

当您遵循结构体默认方法时,您可以保留以后升级到类的选项。

更新于:2022-12-09

11K+ 浏览量

开启您的职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.