Swift项目中的存储属性和计算属性详解
swift The Swift Programming Language 项目地址: 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 // 不可变存储属性
}
存储属性的特点
-
存储位置:
- 全局变量:存储在全局数据区
- 成员变量:存储在对象实例中
- 局部变量:存储在栈上
-
初始化要求:
- 必须在使用前初始化
- 全局变量必须在声明时初始化
- 成员变量可以在声明时初始化,也可以在构造器中初始化
-
类型推断: 当提供初始值时,可以省略类型声明
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
}
}
}
计算属性的特点
- 语法简化:
- setter参数可以省略,默认使用
newValue
- 只读属性可以省略
get
关键字
- setter参数可以省略,默认使用
var area: Double {
return width * height // 只读计算属性
}
-
访问控制:
- 必须提供getter
- 可以只提供getter(只读属性)
- 不能只有setter没有getter
-
成员属性中的self: 在成员计算属性中,可以使用
self
引用当前实例
属性观察器
属性观察器提供了一种监视属性值变化的方式,无需创建计算属性。
willSet和didSet
var score: Int = 0 {
willSet(newScore) {
print("即将将分数从\(score)设置为\(newScore)")
}
didSet {
if score > oldValue {
print("分数增加了\(score - oldValue)")
}
}
}
重要注意事项
-
初始化不触发: 属性观察器不会在初始化时触发
-
特殊情况不触发:
- 在init和deinit方法中赋值
- 在属性观察器内部赋值
-
与计算属性的互斥: 不能同时为属性提供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()
}
}
}
最佳实践建议
-
存储属性选择:
- 需要持久化存储数据时
- 数据需要频繁读写时
-
计算属性选择:
- 值可以从其他属性计算得出时
- 需要封装属性访问逻辑时
-
属性观察器选择:
- 需要在值变化时执行额外操作时
- 需要验证新值时
-
性能考虑:
- 计算属性每次访问都会计算,不适合复杂计算
- 存储属性访问更快,但占用内存
总结
Swift中的属性系统提供了强大的灵活性,开发者可以根据不同场景选择最适合的属性类型。存储属性提供直接的值存储,计算属性提供派生值的能力,而属性观察器则提供了响应值变化的机制。合理使用这些特性可以编写出既高效又易于维护的Swift代码。
swift The Swift Programming Language 项目地址: https://gitcode.com/gh_mirrors/swi/swift
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考