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 的对象是变量,因为我们必须更改属性。
最后,您可以看到输出。很明显,类对象共享内存位置,这就是为什么类的另一个实例能够反映更改的原因。
类和结构体的区别
总结类和结构体的区别
| 比较 | 类 | 结构体 |
|---|---|---|
| 类型 | 类是引用类型。 | 结构体是值类型。 |
| 继承 | 类具有继承性,允许一个类继承另一个类的特性。 | 结构体不支持继承。 |
| 存储 | 类实例存储在堆上。 | 结构体属性存储在栈上。 |
| 初始化器 | 我们必须手动定义初始化器。 | 结构体自动获得默认初始化器。 |
| 线程安全 | 类不是完全线程安全的。 | 结构体始终是线程安全或单例的。 |
结论
您了解了何时使用类和结构体。基于此,您可以决定打算使用哪一个。
继承是类和结构体之间最显著的区别。使用类,您可以清楚地定义子类和父类之间的父子关系。
当您遵循结构体默认方法时,您可以保留以后升级到类的选项。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP