类与对象 #
一、类概述 #
类是引用类型,用于定义对象的蓝图,包含属性和方法。
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