自学内容网 自学内容网

Swift 开发教程系列 - 第7章:类与面向对象编程

在 Swift 中,类(class)是一种引用类型,用于定义复杂的数据模型和行为。类可以通过继承和多态实现代码复用,是 Swift 面向对象编程的核心。接下来,我们将了解类的基本定义、属性、方法、继承以及一些高级概念。

7.1 类的定义与实例化

类的定义与结构体类似,但它是引用类型。在 Swift 中,类不自动提供成员初始化器(initializer),需要手动定义初始化方法。

基本定义
class Person {
    var name: String
    var age: Int

    // 自定义初始化方法
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    // 定义方法
    func introduce() {
        print("My name is \(name) and I am \(age) years old.")
    }
}

// 创建类的实例
let john = Person(name: "John", age: 30)
john.introduce()  // 输出:"My name is John and I am 30 years old."

在上例中,Person 类定义了两个属性 name 和 age,并提供了一个方法 introduce 来打印个人信息。

7.2 类的继承

Swift 的类支持继承,可以创建一个子类继承父类的所有属性和方法。子类可以重写父类的方法以提供自定义实现。

示例代码
class Animal {
    func sound() {
        print("Animal makes a sound")
    }
}

class Dog: Animal {
    override func sound() {
        print("Woof!")
    }
}

let dog = Dog()
dog.sound()  // 输出:"Woof!"

在上例中,Dog 类继承了 Animal 类,并通过 override 关键字重写了 sound 方法。

7.3 引用类型与值类型的区别

类是引用类型,这意味着当一个类实例被赋值或传递时,不会创建拷贝,而是指向同一个实例。

class Car {
    var brand: String
    
    init(brand: String) {
        self.brand = brand
    }
}

let carA = Car(brand: "Toyota")
let carB = carA
carB.brand = "Honda"

print(carA.brand)  // 输出:"Honda"
print(carB.brand)  // 输出:"Honda"

在上例中,carA 和 carB 都指向同一个 Car 实例,因此修改 carB 的 brand 属性会影响 carA。

7.4 类的属性

类的属性可以分为存储属性和计算属性。存储属性用于存储固定值,而计算属性用于动态计算并返回值。

示例代码
class Circle {
    var radius: Double  // 存储属性
    
    // 计算属性
    var area: Double {
        return 3.14159 * radius * radius
    }
    
    init(radius: Double) {
        self.radius = radius
    }
}

let circle = Circle(radius: 5)
print("Area of the circle: \(circle.area)")  // 输出:78.53975

在上例中,area 是一个计算属性,每次访问时都会重新计算圆的面积。

7.5 属性观察器

属性观察器允许你在属性值发生变化时执行特定操作。可以在属性上定义 willSet 和 didSet 观察器,以便在新值被设置之前或之后做出反应。

示例代码
class StepCounter {
    var steps: Int = 0 {
        willSet {
            print("About to set steps to \(newValue)")
        }
        didSet {
            if steps > oldValue {
                print("Added \(steps - oldValue) steps")
            }
        }
    }
}

let stepCounter = StepCounter()
stepCounter.steps = 1000  // 输出:"About to set steps to 1000" 和 "Added 1000 steps"
stepCounter.steps = 1500  // 输出:"About to set steps to 1500" 和 "Added 500 steps"

7.6 类的类型属性与类型方法

类型属性和类型方法属于类本身,而不是某个具体实例。使用 static 关键字定义类型属性和类型方法,子类不能重写 static 方法。如果希望子类可以重写,可以使用 class 关键字。

示例代码
class Math {
    static let pi = 3.14159
    
    static func square(_ number: Double) -> Double {
        return number * number
    }
}

print(Math.pi)                    // 输出:3.14159
print(Math.square(3))             // 输出:9.0

7.7 析构函数(Deinitializer)

析构函数是在实例被销毁时自动调用的函数,用于清理实例。在 Swift 中使用 deinit 关键字定义析构函数。

示例代码
class FileManager {
    init() {
        print("FileManager initialized")
    }
    
    deinit {
        print("FileManager deinitialized")
    }
}

var manager: FileManager? = FileManager()
manager = nil  // 输出:"FileManager deinitialized"

当 manager 被设为 nil 时,FileManager 实例被销毁,触发了 deinit 方法。

通过本章内容,你已了解 Swift 中类的基本使用、继承、属性和析构函数等概念。掌握这些知识后,你可以创建复杂的数据模型并应用面向对象编程思想。下一章我们将探讨协议和扩展,为代码提供更高的灵活性和复用性。


原文地址:https://blog.csdn.net/qq_39653624/article/details/143569790

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!