HoRain云--Swift结构体全解析:高效编程必备
Swift结构体(Struct)是一种值类型的复合数据类型,用于组合多个相关属性。与类不同,结构体在赋值或传递时会进行拷贝而非引用。文章详细介绍了结构体的基本定义、核心特性(值类型、初始化器、可变方法)和高级特性(属性观察器、静态方法、扩展)。通过对比结构体与类的区别,分析了适用场景,并提供了几何形状、数据模型等实际应用示例。最佳实践建议优先使用结构体,保持简单职责,合理使用扩展和初始化器。结构体
·

🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录

Swift 结构体(Struct)
Swift 结构体是一种值类型的复合数据类型,用于将多个相关属性组合成一个单一的实体。与类(class)不同,结构体是值类型,在赋值或传递时会进行拷贝而非引用。
一、结构体的基本定义
1. 基本语法
struct 结构体名称 {
// 属性
var 属性1: 类型
let 属性2: 类型
// 方法
func 方法名() {
// 方法实现
}
// 初始化器
init(参数) {
// 初始化代码
}
}
2. 示例:定义一个简单的结构体
struct Person {
var name: String
var age: Int
let gender: String
// 方法
func description() -> String {
return "\(name) is \(age) years old, gender: \(gender)"
}
// 初始化器
init(name: String, age: Int, gender: String) {
self.name = name
self.age = age
self.gender = gender
}
}
二、结构体的核心特性
1. 值类型特性
var person1 = Person(name: "John", age: 25, gender: "Male")
var person2 = person1 // 创建 person1 的拷贝
person2.name = "Jane"
print(person1.name) // 输出: John (person1 不受影响)
print(person2.name) // 输出: Jane
2. 成员逐一初始化器
Swift 为结构体自动生成成员逐一初始化器:
struct Point {
var x: Double
var y: Double
}
// Swift 自动生成的初始化器
let point1 = Point(x: 10.0, y: 20.0)
3. 可变方法(mutating methods)
由于结构体是值类型,要修改其属性的方法必须标记为 mutating:
struct Rectangle {
var width: Double
var height: Double
mutating func scale(by factor: Double) {
width *= factor
height *= factor
}
}
var rect = Rectangle(width: 10.0, height: 5.0)
rect.scale(by: 2.0) // rect 现在是 width: 20.0, height: 10.0
三、结构体的高级特性
1. 属性观察器
struct Temperature {
var celsius: Double {
didSet {
print("Temperature changed from \(oldValue)°C to \(celsius)°C")
}
willSet {
print("Temperature will change from \(celsius)°C to \(newValue)°C")
}
}
}
2. 静态属性和方法
struct MathConstants {
static let pi = 3.14159265359
static let e = 2.71828182846
static func square(_ number: Double) -> Double {
return number * number
}
}
print(MathConstants.pi) // 3.14159265359
print(MathConstants.square(5)) // 25.0
3. 扩展(Extensions)
extension Person {
func isAdult() -> Bool {
return age >= 18
}
static func createDefault() -> Person {
return Person(name: "Unknown", age: 0, gender: "Unknown")
}
}
4. 协议遵循
protocol Describable {
func getDescription() -> String
}
struct Book: Describable {
var title: String
var author: String
func getDescription() -> String {
return "\(title) by \(author)"
}
}
四、结构体 vs 类
| 特性 | 结构体 | 类 |
|---|---|---|
| 类型 | 值类型 | 引用类型 |
| 内存管理 | 栈分配 | 堆分配 |
| 继承 | 不支持 | 支持 |
| 析构器 | 不支持 | 支持 deinit |
| 引用计数 | 无 | 有 ARC |
| mutating 方法 | 需要 mutating 关键字 |
不需要 |
| 性能 | 通常更快 | 通常较慢 |
五、何时使用结构体
推荐使用结构体的场景:
- 数据相对简单且独立
- 需要值语义(拷贝而非引用)
- 性能敏感的场景
- 不需要继承
- 通常作为临时数据容器
推荐使用类的场景:
- 需要引用语义
- 需要继承
- 需要析构器
- 需要类型转换
- 需要 Objective-C 互操作
六、实际应用示例
1. 几何形状
struct Circle {
var center: (x: Double, y: Double)
var radius: Double
var area: Double {
return MathConstants.pi * radius * radius
}
var circumference: Double {
return 2 * MathConstants.pi * radius
}
}
let circle = Circle(center: (10, 10), radius: 5)
print("Area: \(circle.area)") // Area: 78.53981633974483
2. 数据模型
struct User {
var id: UUID
var username: String
var email: String
var isActive: Bool = true
private var lastLogin: Date?
init(username: String, email: String) {
self.id = UUID()
self.username = username
self.email = email
}
mutating func login() {
lastLogin = Date()
isActive = true
}
func getLastLoginString() -> String {
guard let lastLogin = lastLogin else { return "Never logged in" }
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
return formatter.string(from: lastLogin)
}
}
3. 配置选项
struct AppSettings {
static let shared = AppSettings()
let maxItemsPerPage: Int = 20
let defaultTheme: String = "light"
var notificationEnabled: Bool = true
private init() {}
}
// 使用
print(AppSettings.shared.maxItemsPerPage) // 20
七、最佳实践
- 优先使用结构体:除非需要类的特性,否则优先选择结构体
- 保持简单:结构体应该保持职责单一,避免过度复杂
- 使用扩展:将相关功能通过扩展组织,保持结构体定义简洁
- 注意性能:大型结构体的拷贝可能影响性能,需要权衡
- 合理使用属性观察器:避免在
didSet中执行耗时操作 - 提供良好的初始化器:根据使用场景提供合适的初始化方法
Swift 结构体是强大的工具,结合协议、扩展等特性,可以创建出既高效又灵活的代码结构。理解结构体的值类型特性和适用场景,是编写高质量 Swift 代码的关键。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐


所有评论(0)