18 面向对象编程之类与结构体

在本章中,我们将深入探讨 Swift 编程语言中的结构体,了解它们之间的异同以及如何在实际应用中选择恰当的形式。面向对象编程是现代编程的重要范式,而在 Swift 中,类和结构体是实现这一范式的基本构建块。

类与结构体的基本概念

在 Swift 中,结构体都是用来定义对象的蓝图,但两者有一些根本的区别。以下是它们的主要特点:

  • 引用类型:类是引用类型。当一个类的实例被赋值给变量或常量时,实际传递的是对该实例的引用,而不是复制该实例。
  • 继承:类可以通过继承来创建子类,从而复用、扩展或者修改父类的行为。

结构体

  • 值类型:结构体是值类型。当一个结构体的实例被赋值给变量或常量时,会创建该实例的一个副本。
  • 不支持继承:结构体不能继承,这使得它们更为轻量,适合于简单的数据组合。

类与结构体的语法

在 Swift 中,定义类与结构体的语法非常相似,下面是两者的基本定义形式。

定义类

1
2
3
4
5
6
7
8
9
10
11
class Animal {
var name: String

init(name: String) {
self.name = name
}

func makeSound() {
print("\(name) makes a sound.")
}
}

定义结构体

1
2
3
4
5
6
7
8
struct Vehicle {
var type: String
var wheels: Int

func displayInfo() {
print("This is a \(type) with \(wheels) wheels.")
}
}

类与结构体的实例

为了进一步理解类与结构体的行为,我们来看看一些实例。

类的实例

1
2
3
4
5
6
let dog = Animal(name: "Dog")
dog.makeSound() // 输出: Dog makes a sound.

let anotherDog = dog
anotherDog.name = "Another Dog"
dog.makeSound() // 输出: Another Dog makes a sound.

在上面的代码中,我们创建了一个 Animal 的实例 dog。然后我们将 dog 赋值给 anotherDog。由于 Animal 是引用类型,因此修改 anotherDogname 属性也会影响 dogname 属性。

结构体的实例

1
2
3
4
5
6
var car = Vehicle(type: "Car", wheels: 4)
car.displayInfo() // 输出: This is a Car with 4 wheels.

var anotherCar = car
anotherCar.type = "Truck"
car.displayInfo() // 输出: This is a Car with 4 wheels.

在这个例子中,我们创建了一个 Vehicle 的实例 car。当我们将 car 赋值给 anotherCar 时,由于 Vehicle 是值类型,anotherCarcar 的一个副本。修改 anotherCartype 属性不会影响 cartype 属性。

总结

在本章中,我们讨论了类和结构体的基本原则、语法及实例行为。选择使用类还是结构体取决于特定的应用场景。一般来说,当你需要引用类型(对象共享状态)时,使用类;而当你只需要简单的数据封装(值的独立性)时,使用结构体。

接下来,在下章中,我们将深入探讨继承与多态,续接我们在面向对象编程中对类的理解与应用。

18 面向对象编程之类与结构体

https://zglg.work/swift-lang-zero/18/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论