类与对象 #

一、类概述 #

类是引用类型,用于定义对象的蓝图,包含属性和方法。

1.1 类的特点 #

  • 引用类型
  • 支持继承
  • 支持类型转换
  • 支持析构器
  • 支持引用计数

二、定义类 #

2.1 基本语法 #

swift
class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func introduce() -> String {
        return "我是\(name),今年\(age)岁"
    }
}

let person = Person(name: "张三", age: 25)
print(person.introduce())

2.2 属性 #

swift
class Rectangle {
    var width: Double
    var height: Double
    
    var area: Double {
        return width * height
    }
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
}

let rect = Rectangle(width: 10, height: 5)
print("面积: \(rect.area)")

2.3 方法 #

swift
class Counter {
    var count = 0
    
    func increment() {
        count += 1
    }
    
    func increment(by amount: Int) {
        count += amount
    }
    
    func reset() {
        count = 0
    }
}

let counter = Counter()
counter.increment()
counter.increment(by: 5)
print(counter.count)

三、初始化器 #

3.1 指定初始化器 #

swift
class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

3.2 便利初始化器 #

swift
class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    convenience init(name: String) {
        self.init(name: name, age: 0)
    }
}

let person1 = Person(name: "张三", age: 25)
let person2 = Person(name: "李四")

3.3 可失败初始化器 #

swift
class Person {
    var name: String
    var age: Int
    
    init?(name: String, age: Int) {
        guard age >= 0 else { return nil }
        self.name = name
        self.age = age
    }
}

if let person = Person(name: "张三", age: -1) {
    print(person.name)
} else {
    print("初始化失败")
}

3.4 必要初始化器 #

swift
class Animal {
    var name: String
    
    required init(name: String) {
        self.name = name
    }
}

class Dog: Animal {
    var breed: String
    
    required init(name: String) {
        self.breed = "Unknown"
        super.init(name: name)
    }
}

四、析构器 #

4.1 基本用法 #

swift
class FileHandler {
    var filename: String
    
    init(filename: String) {
        self.filename = filename
        print("打开文件: \(filename)")
    }
    
    deinit {
        print("关闭文件: \(filename)")
    }
}

do {
    let handler = FileHandler(filename: "test.txt")
}
print("作用域结束")

4.2 资源清理 #

swift
class NetworkConnection {
    var isConnected = false
    
    init() {
        connect()
    }
    
    func connect() {
        isConnected = true
        print("已连接")
    }
    
    func disconnect() {
        isConnected = false
        print("已断开")
    }
    
    deinit {
        if isConnected {
            disconnect()
        }
    }
}

五、引用类型 #

5.1 引用语义 #

swift
class Person {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

let person1 = Person(name: "张三")
let person2 = person1

person2.name = "李四"

print(person1.name)
print(person2.name)

5.2 恒等运算符 #

swift
let person1 = Person(name: "张三")
let person2 = Person(name: "张三")
let person3 = person1

print(person1 === person2)
print(person1 === person3)
print(person1 !== person2)

六、类与结构体的区别 #

6.1 值类型 vs 引用类型 #

swift
struct PointStruct {
    var x: Int
    var y: Int
}

class PointClass {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

var structPoint1 = PointStruct(x: 1, y: 2)
var structPoint2 = structPoint1
structPoint2.x = 10
print(structPoint1.x)

var classPoint1 = PointClass(x: 1, y: 2)
var classPoint2 = classPoint1
classPoint2.x = 10
print(classPoint1.x)

6.2 选择建议 #

使用类当:

  • 需要继承
  • 需要引用语义
  • 需要共享状态
  • 需要析构器

使用结构体当:

  • 数据模型简单
  • 需要值语义
  • 不需要继承
  • 主要目的是封装数据

七、实际应用 #

7.1 单例模式 #

swift
class UserManager {
    static let shared = UserManager()
    
    private init() {}
    
    var currentUser: User?
    
    func login(username: String, password: String) -> Bool {
        return true
    }
    
    func logout() {
        currentUser = nil
    }
}

UserManager.shared.login(username: "admin", password: "123456")

7.2 工厂模式 #

swift
protocol Shape {
    func draw()
}

class Circle: Shape {
    func draw() {
        print("画圆")
    }
}

class Square: Shape {
    func draw() {
        print("画方")
    }
}

class ShapeFactory {
    static func createShape(type: String) -> Shape? {
        switch type {
        case "circle":
            return Circle()
        case "square":
            return Square()
        default:
            return nil
        }
    }
}

if let shape = ShapeFactory.createShape(type: "circle") {
    shape.draw()
}

7.3 观察者模式 #

swift
protocol Observer: AnyObject {
    func update(message: String)
}

class Subject {
    private var observers = [Observer]()
    
    func attach(_ observer: Observer) {
        observers.append(observer)
    }
    
    func detach(_ observer: Observer) {
        observers = observers.filter { $0 !== observer }
    }
    
    func notify(message: String) {
        observers.forEach { $0.update(message: message) }
    }
}

class ConcreteObserver: Observer {
    let name: String
    
    init(name: String) {
        self.name = name
    }
    
    func update(message: String) {
        print("\(name) 收到消息: \(message)")
    }
}

八、总结 #

本章学习了Swift类与对象:

  • 类定义:属性和方法
  • 初始化器:指定、便利、可失败
  • 析构器:资源清理
  • 引用类型:共享语义

最佳实践:

  • 合理选择类或结构体
  • 使用必要初始化器
  • 注意循环引用
  • 使用单例管理全局状态

下一章,我们将学习属性!

最后更新:2026-03-26