0Pricing
Swift Academy · 课时

使用 $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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建自定义属性包装器
  2. 使用 $binding 访问投影值
  3. Combine 中的 @Published 与观察机制
  4. 组合多个属性包装器
← 返回 Swift Academy