Swift项目中的存储属性和计算属性详解

Swift项目中的存储属性和计算属性详解

swift The Swift Programming Language swift 项目地址: https://gitcode.com/gh_mirrors/swi/swift

前言

在Swift编程语言中,属性(Properties)是类型的重要组成部分,它们将值与特定的类、结构体或枚举关联起来。Swift提供了两种类型的属性:存储属性(Stored Properties)和计算属性(Computed Properties)。理解这两种属性的区别和使用场景对于编写高效、清晰的Swift代码至关重要。

存储属性详解

基本概念

存储属性是最简单的属性形式,它们将常量或变量的值作为实例的一部分存储起来。存储属性可以是变量(var)或常量(let)。

struct Person {
    var name: String  // 可变存储属性
    let age: Int     // 不可变存储属性
}

存储属性的特点

  1. 存储位置

    • 全局变量:存储在全局数据区
    • 成员变量:存储在对象实例中
    • 局部变量:存储在栈上
  2. 初始化要求

    • 必须在使用前初始化
    • 全局变量必须在声明时初始化
    • 成员变量可以在声明时初始化,也可以在构造器中初始化
  3. 类型推断: 当提供初始值时,可以省略类型声明

var count = 10  // 类型推断为Int

模式匹配中的存储属性

Swift的模式匹配也会创建存储属性:

switch optionalValue {
case .some(let value):  // value是存储属性
    print(value)
case .none:
    break
}

计算属性详解

基本概念

计算属性不直接存储值,而是提供一个getter和可选的setter来间接获取和设置其他属性或值。

struct Rectangle {
    var x, y, width, height: Double
    
    var centerX: Double {
        get {
            return x + width/2
        }
        set(newCenterX) {
            x = newCenterX - width/2
        }
    }
}

计算属性的特点

  1. 语法简化
    • setter参数可以省略,默认使用newValue
    • 只读属性可以省略get关键字
var area: Double {
    return width * height  // 只读计算属性
}
  1. 访问控制

    • 必须提供getter
    • 可以只提供getter(只读属性)
    • 不能只有setter没有getter
  2. 成员属性中的self: 在成员计算属性中,可以使用self引用当前实例

属性观察器

属性观察器提供了一种监视属性值变化的方式,无需创建计算属性。

willSet和didSet

var score: Int = 0 {
    willSet(newScore) {
        print("即将将分数从\(score)设置为\(newScore)")
    }
    didSet {
        if score > oldValue {
            print("分数增加了\(score - oldValue)")
        }
    }
}

重要注意事项

  1. 初始化不触发: 属性观察器不会在初始化时触发

  2. 特殊情况不触发

    • 在init和deinit方法中赋值
    • 在属性观察器内部赋值
  3. 与计算属性的互斥: 不能同时为属性提供getter/setter和观察器

属性重写规则

重写只读属性

子类可以将超类的只读计算属性重写为存储属性:

class Vehicle {
    var speed: Double {
        return 0.0
    }
}

class Car: Vehicle {
    override var speed: Double = 60.0  // 重写为存储属性
}

重写读写属性

对于读写属性,子类只能通过计算属性或添加观察器来重写:

class Speedometer {
    var speed: Double = 0.0 {
        didSet {
            print("速度已更新")
        }
    }
}

class DigitalSpeedometer: Speedometer {
    override var speed: Double {
        didSet {
            displaySpeedOnScreen()
        }
    }
}

最佳实践建议

  1. 存储属性选择

    • 需要持久化存储数据时
    • 数据需要频繁读写时
  2. 计算属性选择

    • 值可以从其他属性计算得出时
    • 需要封装属性访问逻辑时
  3. 属性观察器选择

    • 需要在值变化时执行额外操作时
    • 需要验证新值时
  4. 性能考虑

    • 计算属性每次访问都会计算,不适合复杂计算
    • 存储属性访问更快,但占用内存

总结

Swift中的属性系统提供了强大的灵活性,开发者可以根据不同场景选择最适合的属性类型。存储属性提供直接的值存储,计算属性提供派生值的能力,而属性观察器则提供了响应值变化的机制。合理使用这些特性可以编写出既高效又易于维护的Swift代码。

swift The Swift Programming Language swift 项目地址: https://gitcode.com/gh_mirrors/swi/swift

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤璞亚Heath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值