Jupyter AI

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

📅 发表日期: 2024年8月15日

分类: 🦢Swift 语言入门

👁️阅读: --

在本章中,我们将深入探讨 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 是引用类型,因此修改 anotherDogname 属性也会影响 dogname 属性。

结构体的实例

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 属性。

总结

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

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