拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Swift 类详解:从基础语法到高级特性

1. 引言Swift 中的类Class是面向对象编程的核心概念它提供了一种封装数据和行为的方式。与结构体Struct不同类是引用类型支持继承、类型转换和析构等特性。本文将系统讲解 Swift 类的定义、属性、方法、继承、多态等核心内容并通过丰富的代码实例帮助读者深入理解。2. 类的基本定义在 Swift 中使用class关键字定义一个类。类名通常采用大驼峰命名法UpperCamelCase。下面是一个最简单的类定义示例class Person { var name: String var age: Int init(name: String, age: Int) { self.name name self.age age } }上面的代码定义了一个Person类包含两个存储属性name和age以及一个自定义初始化方法。创建实例的方式如下let person Person(name: 张三, age: 25) print(姓名\(person.name)年龄\(person.age))3. 属性详解Swift 类的属性分为存储属性Stored Properties和计算属性Computed Properties两大类。3.1 存储属性存储属性用于存储常量或变量的值是类实例的一部分。可以在定义时设置默认值也可以在初始化方法中赋值class Student { var studentID: String let schoolName: String 清华大学 var grade: Int init(studentID: String, grade: Int) { self.studentID studentID self.grade grade } }注意使用let声明的常量属性在初始化后不能被修改。3.2 计算属性计算属性不直接存储值而是通过 getter 和 setter 来获取和设置其他属性的值class Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width width self.height height } // 计算属性面积 var area: Double { get { return width * height } } // 计算属性周长带 setter var perimeter: Double { get { return 2 * (width height) } set { // 假设正方形根据周长反推边长 width newValue / 4 height newValue / 4 } } } let rect Rectangle(width: 5.0, height: 3.0) print(面积\(rect.area)) // 输出面积15.0 print(周长\(rect.perimeter)) // 输出周长16.03.3 属性观察器属性观察器用于监控属性值的变化在属性值即将设置或已经设置时触发class BankAccount { var balance: Double 0 { willSet { print(余额即将从 \(balance) 变为 \(newValue)) } didSet { print(余额已从 \(oldValue) 变为 \(balance)) } } } let account BankAccount() account.balance 1000 // 输出 // 余额即将从 0.0 变为 1000.0 // 余额已从 0.0 变为 1000.04. 方法类的方法分为实例方法Instance Methods和类型方法Type Methods。4.1 实例方法实例方法属于类的实例通过实例调用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)) // 输出当前计数64.2 类型方法类型方法使用static或class关键字声明通过类型本身调用。其中class关键字允许子类重写class MathUtils { static func square(_ number: Int) - Int { return number * number } class func cube(_ number: Int) - Int { return number * number * number } } print(MathUtils.square(4)) // 输出16 print(MathUtils.cube(3)) // 输出275. 继承继承是面向对象编程的重要特性Swift 中的类支持单继承即一个类只能继承自一个父类。5.1 基本继承class Animal { var name: String init(name: String) { self.name name } func makeSound() { print(\(name) 发出声音) } } class Dog: Animal { func fetch() { print(\(name) 正在捡球) } } let dog Dog(name: 旺财) dog.makeSound() // 输出旺财 发出声音 dog.fetch() // 输出旺财 正在捡球5.2 方法重写子类可以使用override关键字重写父类的方法、属性或下标class Cat: Animal { override func makeSound() { print(\(name) 喵喵叫) } } let cat Cat(name: 咪咪) cat.makeSound() // 输出咪咪 喵喵叫5.3 调用父类方法在重写方法中可以使用super关键字调用父类的方法class Bird: Animal { override func makeSound() { super.makeSound() print(\(name) 叽叽喳喳) } } let bird Bird(name: 小黄) bird.makeSound() // 输出 // 小黄 发出声音 // 小黄 叽叽喳喳6. 多态与类型转换多态允许使用父类类型的引用指向子类实例并通过类型转换Type Casting在运行时判断和转换实际类型。6.1 多态示例let animals: [Animal] [Dog(name: 旺财), Cat(name: 咪咪), Bird(name: 小黄)] for animal in animals { animal.makeSound() } // 输出 // 旺财 发出声音 // 咪咪 喵喵叫 // 小黄 发出声音 // 小黄 叽叽喳喳6.2 类型检查与转换for animal in animals { if animal is Dog { print(\(animal.name) 是一只狗) } if let dog animal as? Dog { dog.fetch() } }使用is进行类型检查使用as?进行可选类型转换使用as!进行强制类型转换不推荐可能崩溃。7. 类的生命周期与析构Swift 使用自动引用计数ARC管理类的内存。当实例不再被引用时会自动调用析构方法deinitclass Resource { let name: String init(name: String) { self.name name print(\(name) 资源已创建) } deinit { print(\(name) 资源已释放) } } var resource: Resource? Resource(name: 数据库连接) resource nil // 输出 // 数据库连接 资源已创建 // 数据库连接 资源已释放8. 类与结构体的对比类和结构体在 Swift 中非常相似但有几个关键区别。下表总结了主要差异特性类Class结构体Struct类型引用类型值类型继承支持不支持类型转换支持不支持析构方法支持 deinit不支持引用计数支持 ARC不支持赋值行为共享同一实例复制数据下面通过代码演示两者的赋值差异class ClassPerson { var name: String init(name: String) { self.name name } } struct StructPerson { var name: String } // 类的引用语义 let classPerson1 ClassPerson(name: 张三) let classPerson2 classPerson1 classPerson2.name 李四 print(classPerson1.name) // 输出李四共享同一实例 // 结构体的值语义 var structPerson1 StructPerson(name: 张三) var structPerson2 structPerson1 structPerson2.name 李四 print(structPerson1.name) // 输出张三互不影响9. 循环引用与弱引用在使用闭包或类之间相互引用时可能产生循环引用导致内存泄漏。Swift 提供了weak和unowned关键字来解决这个问题class Department { var name: String var employee: Employee? init(name: String) { self.name name } deinit { print(\(name) 部门已释放) } } class Employee { var name: String weak var department: Department? init(name: String) { self.name name } deinit { print(\(name) 员工已释放) } } var department: Department? Department(name: 技术部) var employee: Employee? Employee(name: 张三) department?.employee employee employee?.department department department nil employee nil // 输出 // 技术部 部门已释放 // 张三 员工已释放在上面的例子中Employee类的department属性使用了weak关键字打破了循环引用使得两个实例都能被正确释放。10. 总结本文系统介绍了 Swift 类的核心知识包括类的定义、属性、方法、继承、多态、生命周期以及与结构体的对比。类作为引用类型在需要共享状态、继承和多态的场景下非常有用而结构体作为值类型更适合表示简单的数据模型。在实际开发中应根据具体需求选择合适的类型。建议读者结合本文的代码实例动手实践加深对 Swift 类的理解。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门