Swift 中的结构体与类:深入理解与选择指南
swift-book The Swift Programming Language book 项目地址: https://gitcode.com/gh_mirrors/sw/swift-book
概述
在 Swift 编程语言中,结构体(struct)和类(class)是构建代码的基础模块,它们允许开发者创建自定义类型来封装数据和行为。虽然两者在功能上有许多相似之处,但在底层实现和使用场景上存在关键差异。
结构体与类的共同点
Swift 中的结构体和类都支持以下功能:
- 属性存储:可以定义变量或常量属性来存储值
- 方法实现:能够添加功能性的方法
- 下标访问:支持使用下标语法访问值
- 初始化器:可以定义初始化方法来设置初始状态
- 扩展性:可以通过扩展来增加功能
- 协议遵循:能够遵循协议来实现标准功能
类的独有特性
类相比结构体具有以下额外能力:
- 继承:支持单继承,一个类可以继承另一个类的特性
- 类型转换:支持运行时类型检查和转换
- 析构器:实例销毁时可以执行清理操作
- 引用计数:支持多个引用指向同一个实例
定义语法对比
结构体和类的定义语法非常相似:
// 结构体定义
struct Resolution {
var width = 0
var height = 0
}
// 类定义
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
Swift 的类型命名采用大驼峰式(UpperCamelCase),属性和方法采用小驼峰式(lowerCamelCase)。
实例创建与属性访问
创建实例的语法相同:
let someResolution = Resolution()
let someVideoMode = VideoMode()
使用点语法访问属性:
print(someResolution.width) // 访问属性
someVideoMode.resolution.width = 1280 // 修改属性
结构体的成员初始化器
结构体自动获得成员初始化器:
let vga = Resolution(width: 640, height: 480)
而类不会自动获得这种初始化器。
值类型 vs 引用类型
结构体是值类型
值类型在赋值或传递时会被复制。Swift 中的基本类型(Int, Double, Bool等)、字符串、数组、字典和枚举都是值类型。
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd // 这里会创建hd的副本
cinema.width = 2048 // 只修改cinema的副本
print(hd.width) // 1920 (原值不变)
print(cinema.width) // 2048
类是引用类型
引用类型在赋值或传递时不会复制实例,而是共享同一个实例的引用。
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
let alsoTenEighty = tenEighty // 引用同一个实例
alsoTenEighty.frameRate = 30.0
print(tenEighty.frameRate) // 30.0
print(alsoTenEighty.frameRate) // 30.0 (两者相同)
恒等运算符
对于引用类型,可以使用恒等运算符判断是否引用同一个实例:
===
判断两个引用是否指向同一个实例!==
判断两个引用是否指向不同实例
选择建议
在实际开发中,建议遵循以下原则:
- 优先使用结构体:结构体更简单、更安全,适用于大多数场景
- 需要继承时使用类:当需要继承或需要引用语义时才使用类
- 考虑性能:对于大型数据结构,引用类型可能更高效
- 线程安全:值类型在多线程环境下更安全
总结
Swift 中的结构体和类各有优势,理解它们的区别对于编写高效、安全的代码至关重要。值类型提供更简单的行为模型,而引用类型则提供了更灵活的对象关系。在实际开发中,应根据具体需求选择最合适的类型。
swift-book The Swift Programming Language book 项目地址: https://gitcode.com/gh_mirrors/sw/swift-book
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考