🎬 HoRain 云小助手个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

Swift 结构体(Struct)

一、结构体的基本定义

1. 基本语法

2. 示例:定义一个简单的结构体

二、结构体的核心特性

1. 值类型特性

2. 成员逐一初始化器

3. 可变方法(mutating methods)

三、结构体的高级特性

1. 属性观察器

2. 静态属性和方法

3. 扩展(Extensions)

4. 协议遵循

四、结构体 vs 类

五、何时使用结构体

六、实际应用示例

1. 几何形状

2. 数据模型

3. 配置选项

七、最佳实践


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

七、最佳实践

  1. 优先使用结构体:除非需要类的特性,否则优先选择结构体
  2. 保持简单:结构体应该保持职责单一,避免过度复杂
  3. 使用扩展:将相关功能通过扩展组织,保持结构体定义简洁
  4. 注意性能:大型结构体的拷贝可能影响性能,需要权衡
  5. 合理使用属性观察器:避免在 didSet 中执行耗时操作
  6. 提供良好的初始化器:根据使用场景提供合适的初始化方法

Swift 结构体是强大的工具,结合协议、扩展等特性,可以创建出既高效又灵活的代码结构。理解结构体的值类型特性和适用场景,是编写高质量 Swift 代码的关键。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐