18 面向对象编程之类与结构体
在本章中,我们将深入探讨 Swift 编程语言中的类与结构体,了解它们之间的异同以及如何在实际应用中选择恰当的形式。面向对象编程是现代编程的重要范式,而在 Swift 中,类和结构体是实现这一范式的基本构建块。
类与结构体的基本概念
在 Swift 中,类
和结构体
都是用来定义对象的蓝图,但两者有一些根本的区别。以下是它们的主要特点:
类
- 引用类型:类是引用类型。当一个类的实例被赋值给变量或常量时,实际传递的是对该实例的引用,而不是复制该实例。
- 继承:类可以通过继承来创建子类,从而复用、扩展或者修改父类的行为。
结构体
- 值类型:结构体是值类型。当一个结构体的实例被赋值给变量或常量时,会创建该实例的一个副本。
- 不支持继承:结构体不能继承,这使得它们更为轻量,适合于简单的数据组合。
类与结构体的语法
在 Swift 中,定义类与结构体的语法非常相似,下面是两者的基本定义形式。
定义类
class Animal {
var name: String
init(name: String) {
self.name = name
}
func makeSound() {
print("$name) makes a sound.")
}
}
定义结构体
struct Vehicle {
var type: String
var wheels: Int
func displayInfo() {
print("This is a $type) with $wheels) wheels.")
}
}
类与结构体的实例
为了进一步理解类与结构体的行为,我们来看看一些实例。
类的实例
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
是引用类型,因此修改 anotherDog
的 name
属性也会影响 dog
的 name
属性。
结构体的实例
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
是值类型,anotherCar
是 car
的一个副本。修改 anotherCar
的 type
属性不会影响 car
的 type
属性。
总结
在本章中,我们讨论了类和结构体的基本原则、语法及实例行为。选择使用类还是结构体取决于特定的应用场景。一般来说,当你需要引用类型(对象共享状态)时,使用类;而当你只需要简单的数据封装(值的独立性)时,使用结构体。
接下来,在下章中,我们将深入探讨继承与多态,续接我们在面向对象编程中对类的理解与应用。