使用 $binding 访问投影值
公开 projectedValue,通过 $ 前缀提供额外功能。
使用 $binding 访问投影值 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
投影值(通过 `$` 访问)为属性包装器提供了第二个接口——SwiftUI 的 `@State` 和 `@Published` 就利用它来公开 `Binding` 和 `Publisher`。
添加 projectedValue
```swift
@propertyWrapper
struct Toggle {
var wrappedValue: Bool = false
var projectedValue: String { wrappedValue ? "ON" : "OFF" }
}
struct Model { @Toggle var active }
var m = Model()
print(m.$active) // "OFF" — projected value accessed with $
```
projectedValue 的类型
投影值可以是任意类型——`Binding`、`Publisher`、`String` 或自定义类型。
SwiftUI 的 `@State` 会投影出 `Binding`,从而支持双向数据流。
绑定投影示例
```swift
// @State projects Binding:
@State var isOn = false
Toggle(isOn: $isOn) // $isOn is Binding
```
自定义绑定投影
```swift
@propertyWrapper
struct Validated {
var wrappedValue: String
var projectedValue: Bool { !wrappedValue.isEmpty }
}
struct Form { @Validated var email = "" }
var f = Form()
f.email = "hi@example.com"
print(f.$email) // true — projected Bool
```
@Published 投影
```swift
class VM: ObservableObject {
@Published var score = 0
}
let vm = VM()
let cancellable = vm.$score // Publisher
.sink { print("Score: \($0)") }
vm.score = 10 // "Score: 10"
```
在包装器内部访问 projectedValue
```swift
@propertyWrapper
struct History {
private var current: T
private(set) var projectedValue: [T] = []
var wrappedValue: T {
get { current }
set { projectedValue.append(current); current = newValue }
}
init(wrappedValue: T) { current = wrappedValue }
}
```
使用 History 包装器
```swift
struct Counter { @History var count = 0 }
var c = Counter()
c.count = 1; c.count = 5; c.count = 3
print(c.$count) // [0,1,5] — history of old values
```
$ 语法的区分
```swift
struct Form {
@State var text = ""
var body: some View {
TextField("Enter", text: $text) // $text is Binding
}
}
// text → String (wrappedValue)
// $text → Binding (projectedValue)
```
设计注意事项
• `projectedValue` 是可选的——只有在需要第二个接口时才添加
• 它的类型可以与 `wrappedValue` 完全不同
• 在调用位置使用 `$` 访问投影值
• 投影值非常适合 Combine 发布者和 SwiftUI 绑定
快速检查
如何访问属性包装器的 `projectedValue`?
回顾
要点:
• `projectedValue` 通过 `$` 为包装器提供第二个 API
• 可以是任意类型——Binding、Publisher、Bool、Array
• `@State` 投影出 `Binding`;`@Published` 投影出 `Publisher`
• 在主体和调用位置都可以使用 `$propertyName` 访问
• 只有在第二个接口确实有价值时才添加
下一节:@Published 与 Combine。
常见问题解答
「使用 $binding 访问投影值」课时是免费的吗?
是的 — 「使用 $binding 访问投影值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「使用 $binding 访问投影值」这节课中我会学到什么?
公开 projectedValue,通过 $ 前缀提供额外功能。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 $binding 访问投影值」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 创建自定义属性包装器
- 使用 $binding 访问投影值
- Combine 中的 @Published 与观察机制
- 组合多个属性包装器