结构体中的计算属性
使用仅支持 get 以及支持 get/set 的计算属性派生值。
结构体中的计算属性 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
计算属性不会存储值,而是按需计算并返回值。对于调用者来说,它们看起来像属性,但实际上会在底层运行代码。
只读计算属性
```swift
struct Circle {
var radius: Double
var area: Double { .pi * radius * radius }
var circumference: Double { 2 * .pi * radius }
}
var c = Circle(radius: 5)
print(c.area) // 78.53...
```
get 和 set
```swift
struct Temperature {
var celsius: Double
var fahrenheit: Double {
get { celsius * 9/5 + 32 }
set { celsius = (newValue - 32) * 5/9 }
}
}
var t = Temperature(celsius: 0)
print(t.fahrenheit) // 32
t.fahrenheit = 212
print(t.celsius) // 100
```
简写 get——省略 get 关键字
对于只读属性,`get { }` 包装器是可选的:
```swift
var area: Double { .pi * radius * radius } // same as { get { ... } }
```
set 中的 newValue
在 `set` 中,传入值默认命名为 `newValue`:
```swift
set { celsius = (newValue - 32) * 5/9 }
```
您也可以显式命名它:
```swift
set(degF) { celsius = (degF - 32) * 5/9 }
```
计算属性不会被存储
计算属性没有后备存储空间——每次访问都会运行其中的代码:
```swift
struct Stats {
var scores: [Int]
var average: Double {
guard !scores.isEmpty else { return 0 }
return Double(scores.reduce(0,+)) / Double(scores.count)
}
}
```
静态计算属性
```swift
struct Config {
static var appName: String {
Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "App"
}
}
print(Config.appName)
```
协议中的计算属性
```swift
protocol Greetable {
var greeting: String { get }
}
struct Person: Greetable {
var name: String
var greeting: String { "Hello, \(name)!" }
}
```
协议可以要求实现计算属性,只需指定 `{ get }` 或 `{ get set }`。
计算属性与存储属性的性能
• 计算属性:每次访问都会重新计算——避免在频繁读取的属性中进行昂贵的计算
• 对于昂贵的一次性计算值,请使用 `lazy var`:
```swift
lazy var thumbnail: UIImage = generateThumbnail()
```
表达式体与代码块
Swift 5.9+ 中的单表达式计算属性会隐式返回值:
```swift
var fullName: String { "\(first) \(last)" }
// equivalent to:
var fullName: String { return "\(first) \(last)" }
```
快速检查
在属性 `set` 代码块中,传入值的默认名称是什么?
总结
主要要点:
• 计算属性会在每次访问时运行代码,不使用存储空间
• 只读属性:省略 `get`/`set`,或使用 `{ return ... }` 简写
• 可读写属性:提供 `get` 和 `set(newValue)` 代码块
• 适合表示 `area`、`fullName`、单位转换等派生值
• 对于昂贵的一次性计算值,请使用 `lazy`
接下来:可变方法。
常见问题解答
「结构体中的计算属性」课时是免费的吗?
是的 — 「结构体中的计算属性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「结构体中的计算属性」这节课中我会学到什么?
使用仅支持 get 以及支持 get/set 的计算属性派生值。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「结构体中的计算属性」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 成员初始化器与自定义初始化器
- 存储属性与属性观察器
- 结构体中的计算属性
- 可变方法与写时复制语义