Swift 类(建议收藏)

Swift 类:面向对象编程的核心基石

在 Swift 语言中,类(Class)是构建复杂应用结构的基石。它不仅是一种数据封装方式,更是实现代码复用、逻辑组织和面向对象思想的核心工具。如果你曾用过 Java 或 Objective-C,那么 Swift 类会带给你熟悉的“模板”感觉——但又更简洁、更安全。

想象一下,你正在设计一个宠物店管理系统。每一只狗都有名字、年龄和性格,还会“汪汪”叫。如果每次写代码都重复这些属性和行为,效率极低。而 Swift 类就像一个“狗的模板”,定义好一只狗该有哪些特征和能做什么,之后就可以快速创建多只狗对象,每个都独一无二。

接下来,我们就从基础语法讲起,逐步深入 Swift 类的精髓。

类的基本语法与定义

在 Swift 中,使用 class 关键字定义一个类。类名通常采用大驼峰命名法,比如 DogCarUser

class Dog {
    // 类的成员在这里定义
}

这只是一个空壳。真正的价值在于给类添加属性和方法。

属性:类的“特征”

属性是类所拥有的数据。比如狗有名字、年龄、体重。在 Swift 中,属性分为存储属性和计算属性。

class Dog {
    // 存储属性:直接保存数据
    var name: String = "无名"
    var age: Int = 1
    var weight: Double = 5.0
}

✅ 注释:nameageweight 都是存储属性,它们会为每个 Dog 实例保存独立的数据。
✅ 注释:StringIntDouble 是 Swift 的基本类型,用于描述数据的种类。

方法:类的“行为”

方法是类能执行的动作。比如狗会“叫”或“吃东西”。

class Dog {
    var name: String = "无名"
    var age: Int = 1
    var weight: Double = 5.0

    // 方法定义:用 func 关键字
    func bark() {
        print("\(name) 汪汪叫!")
    }

    // 带参数的方法
    func eat(food: String) {
        print("\(name) 吃了 \(food)!")
    }
}

✅ 注释:bark() 方法没有参数,执行时打印狗的名字和叫声。
✅ 注释:eat(food:) 接收一个字符串参数,表示食物名称,增强灵活性。


实例化对象:从类到具体个体

定义好类后,不能直接使用,必须“创建实例”(也叫对象)。这就像用模具生产产品一样,类是模具,实例是生产出来的具体产品。

// 创建一个 Dog 实例
let myDog = Dog()

// 调用实例的方法
myDog.bark()           // 输出:无名 汪汪叫!
myDog.eat(food: "骨头") // 输出:无名 吃了 骨头!

// 修改属性值
myDog.name = "小黄"
myDog.age = 3

myDog.bark() // 输出:小黄 汪汪叫!

✅ 注释:let myDog = Dog() 创建了一个 Dog 类的实例,存储在常量 myDog 中。
✅ 注释:通过 . 操作符访问属性和方法,这是访问对象成员的标准方式。


初始化器:对象的“出生设定”

每个对象在创建时,往往需要设置初始值。Swift 提供了初始化器(Initializer)来完成这个任务。

class Dog {
    var name: String
    var age: Int
    var weight: Double

    // 初始化器:在创建实例时自动调用
    init(name: String, age: Int, weight: Double) {
        self.name = name
        self.age = age
        self.weight = weight
    }

    func bark() {
        print("\(name) 汪汪叫!")
    }

    func eat(food: String) {
        print("\(name) 吃了 \(food)!")
    }
}

✅ 注释:init() 是初始化器,参数名与属性名一致。
✅ 注释:self. 关键字用于区分当前实例的属性和参数,避免歧义。

使用初始化器创建对象:

let dog1 = Dog(name: "旺财", age: 2, weight: 8.5)
dog1.bark() // 输出:旺财 汪汪叫!

let dog2 = Dog(name: "小白", age: 1, weight: 4.0)
dog2.eat(food: "狗粮") // 输出:小白 吃了 狗粮!

✅ 注释:初始化器让对象创建时就拥有有意义的数据,避免了后续手动赋值的麻烦。


计算属性与属性观察器:更智能的属性

有时候,属性的值不是直接存储的,而是根据其他属性动态计算出来的。这就是“计算属性”。

class Dog {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    // 计算属性:不存储值,而是每次访问时计算
    var isAdult: Bool {
        return age >= 2
    }

    // 属性观察器:在属性值变化时触发
    var weight: Double {
        didSet {
            // 当 weight 改变时,自动执行这段代码
            if weight > 10 {
                print("注意:\(name) 有点胖了!")
            }
        }
    }
}

✅ 注释:isAdult 是计算属性,它根据 age 的值返回布尔值,无需额外存储。
✅ 注释:didSet 是属性观察器,当 weight 被赋新值时自动调用,适合做验证或提醒。

使用示例:

let puppy = Dog(name: "小黑", age: 1, weight: 5.0)
print(puppy.isAdult) // 输出:false

puppy.weight = 12.0 // 触发 didSet,输出:注意:小黑 有点胖了!

类的继承:代码复用的利器

在现实世界中,狗和猫都是动物,它们有共性(如会叫、会吃),也有差异(狗叫“汪”,猫叫“喵”)。Swift 类支持继承,允许一个类“继承”另一个类的属性和方法。

// 父类:Animal
class Animal {
    var name: String

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

    func makeSound() {
        print("动物发出声音")
    }
}

// 子类:Dog 继承 Animal
class Dog: Animal {
    // 继承了 name 属性和 makeSound() 方法
    override func makeSound() {
        print("\(name) 汪汪叫!")
    }

    // 子类可以添加新属性
    var breed: String = "未知品种"
}

✅ 注释:class Dog: Animal 表示 Dog 继承自 Animal。
✅ 注释:override 关键字表示重写父类方法,必须显式声明。
✅ 注释:子类可以扩展新功能,如 breed 属性。

使用继承:

let dog = Dog(name: "旺财", breed: "金毛")
dog.makeSound() // 输出:旺财 汪汪叫!

可变性与内存管理:类的“引用类型”特性

在 Swift 中,类是引用类型。这意味着当你把一个类实例赋值给变量,你实际上是在复制一个“指针”,而不是整个对象。

let dog1 = Dog(name: "小黄", age: 3, weight: 7.0)
let dog2 = dog1  // dog2 指向同一个对象

dog2.name = "小黑"

print(dog1.name) // 输出:小黑
print(dog2.name) // 输出:小黑

✅ 注释:dog1dog2 指向同一块内存,修改其中一个,另一个也会改变。
✅ 注释:这与结构体(struct)不同,结构体是值类型,复制时是完整拷贝。

这种特性在处理大型数据或共享状态时非常有用,但也需注意副作用,避免意外修改。


实际应用案例:宠物店管理系统的简化版

我们来整合所有知识,构建一个简单的宠物店管理系统。

class Pet {
    var name: String
    var species: String

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

    func info() {
        print("\(name) 是一只 \(species)")
    }
}

class Dog: Pet {
    var isTrained: Bool = false

    override func info() {
        print("\(name) 是一只 \(species),会训练")
    }

    func fetch() {
        print("\(name) 去捡球了!")
    }
}

class Cat: Pet {
    var isLazy: Bool = true

    override func info() {
        print("\(name) 是一只 \(species),很懒")
    }
}

// 使用示例
let pet1 = Dog(name: "旺财", species: "狗")
let pet2 = Cat(name: "咪咪", species: "猫")

pet1.info()  // 输出:旺财 是一只 狗,会训练
pet2.info()  // 输出:咪咪 是一只 猫,很懒

pet1.fetch() // 输出:旺财 去捡球了!

这个例子展示了类的封装、继承、多态,是实际开发中常见的模式。


总结:掌握 Swift 类,迈向高效开发

Swift 类不仅是语法糖,更是构建清晰、可维护代码的工具。它让你能够把现实世界中的“事物”抽象成代码,用属性描述“是什么”,用方法描述“能做什么”,用继承实现“共性与个性”的统一。

从初始化器到属性观察器,从计算属性到继承机制,每一个特性都在为你的项目提供结构化支持。当你熟练掌握 Swift 类,你就拥有了构建复杂应用的骨架能力。

无论是开发 App、后台服务,还是构建可复用的框架,Swift 类都是你不可或缺的伙伴。现在,是时候动手写第一个类了。