@Binding 的那些事

先理解 @Binding 解决什么问题

@State 的时候,状态归属于某一个 View。但子 View 怎么修改父 View 的状态?

swift 复制代码
struct ParentView: View {
    @State var isOn: Bool = false

    var body: some View {
        ToggleView(isOn: isOn) // ❌ 子 View 拿到的只是一个值的拷贝
    }
}

你把 isOn 传给子 View,子 View 改了它自己的拷贝,父 View 毫不知情,UI 也不会更新。


@Binding 就是用来解决这个问题的

@Binding 不是一份数据的拷贝 ,而是一条双向通道,指向原始数据的存储位置。 读它,读的是原始值;写它,写的是原始存储,父 View 会同步感知并刷新。

swift 复制代码
// 父 View:状态归属于这里
struct ParentView: View {
    @State var isOn: Bool = false

    var body: some View {
        // 用 $ 前缀把 @State 转成 Binding 传下去
        ToggleView(isOn: $isOn)
    }
}

// 子 View:不拥有状态,只拿到一条"通道"
struct ToggleView: View {
    @Binding var isOn: Bool  // 声明为 Binding,表示"我不拥有这个数据"

    var body: some View {
        Button("切换") {
            isOn.toggle()   // 写的是父 View 里的原始 @State,触发父 View 刷新
        }
    }
}

@Binding 的本质

swift 复制代码
@propertyWrapper
public struct Binding<Value> {
    // 你平时用 isOn 读写的就是这个
    public var wrappedValue: Value { get nonmutating set }

    // 你用 $isOn 拿到的还是 Binding 自身,可以继续往下传
    public var projectedValue: Binding<Value> { get }
}

@Binding 内部存的不是值本身,而是一对 getter + setter 闭包 ,分别指向上层 @State(或其他数据源)的读写操作。所以写 isOn = true 时,实际上是调用了那个 setter 闭包,最终改变的是父 View 的 @State


使用 @Binding 时需要关心的问题

  1. 数据归属权问题@Binding 的原则是"我不拥有数据,我只是一个读写通道"。如果一个 View 需要拥有 状态,用 @State;如果只是借用和修改 上层的状态,用 @Binding

  2. 单向来源原则(Single Source of Truth) :一条 @Binding 链条最终必须溯源到某个真实的数据存储(比如 @State@StateObject 中的属性),不要出现 Binding 套 Binding 套 Binding 的迷宫,链条越短越清晰。

  3. $ 符号的含义$isOn 拿到的是 projectedValue,对 @State 来说它是一个 Binding<Bool>,这就是为什么父 View 传 $isOn,而子 View 声明 @Binding var isOn,类型是对得上的。

  4. 不要在 body 外部调用 :和 @State 一样,对 @Binding 属性的读写应发生在 bodybody 调用的方法中,以确保 SwiftUI 能正确追踪依赖。

复制代码
相关推荐
Lvan的前端笔记3 天前
SwiftUI:iOS 常用视图组件速查
ios·swiftui·swift
HarderCoder5 天前
SwiftUI 可复用视图设计解剖:从语义到 API 的完整实践
swiftui·swift
东坡肘子5 天前
当灵感跑在了结果前面 -- 肘子的 Swift 周报 #145
人工智能·swiftui·swift
霍霍哈嗨10 天前
swiftUI框架基础
ios·swiftui·swift
东坡肘子12 天前
当每一次写入都有了新价格 -- 肘子的 Swift 周报 #144
人工智能·swiftui·swift
CHB18 天前
uni-app x 蒸汽模式 iOS版 性能测试基准报告 Benchmark
ios·uni-app·swiftui
大熊猫侯佩19 天前
SwiftUI 侦探笔记:iPhone 14 失踪的“刘海”与侯佩的像素诡计
swiftui·swift·apple
大熊猫侯佩19 天前
WWDC26 新 @ContentBuilder 修饰符:SwiftUI 终于有了户口本
swiftui·swift·wwdc
东坡肘子19 天前
当 Linux 成为“空气”:容器、Agent 与不再重要的“桌面之争” -- 肘子的 Swift 周报 #143
人工智能·swiftui·swift
东坡肘子1 个月前
SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142
人工智能·swiftui·swift