Swift 类:面向对象编程的核心基石
在 Swift 语言中,类(Class)是构建复杂应用结构的基石。它不仅是一种数据封装方式,更是实现代码复用、逻辑组织和面向对象思想的核心工具。如果你曾用过 Java 或 Objective-C,那么 Swift 类会带给你熟悉的“模板”感觉——但又更简洁、更安全。
想象一下,你正在设计一个宠物店管理系统。每一只狗都有名字、年龄和性格,还会“汪汪”叫。如果每次写代码都重复这些属性和行为,效率极低。而 Swift 类就像一个“狗的模板”,定义好一只狗该有哪些特征和能做什么,之后就可以快速创建多只狗对象,每个都独一无二。
接下来,我们就从基础语法讲起,逐步深入 Swift 类的精髓。
类的基本语法与定义
在 Swift 中,使用 class 关键字定义一个类。类名通常采用大驼峰命名法,比如 Dog、Car、User。
class Dog {
// 类的成员在这里定义
}
这只是一个空壳。真正的价值在于给类添加属性和方法。
属性:类的“特征”
属性是类所拥有的数据。比如狗有名字、年龄、体重。在 Swift 中,属性分为存储属性和计算属性。
class Dog {
// 存储属性:直接保存数据
var name: String = "无名"
var age: Int = 1
var weight: Double = 5.0
}
✅ 注释:
name、age、weight都是存储属性,它们会为每个 Dog 实例保存独立的数据。
✅ 注释:String、Int、Double是 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) // 输出:小黑
✅ 注释:
dog1和dog2指向同一块内存,修改其中一个,另一个也会改变。
✅ 注释:这与结构体(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 类都是你不可或缺的伙伴。现在,是时候动手写第一个类了。