@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 能正确追踪依赖。

复制代码
相关推荐
东坡肘子5 天前
越来越慢的 App Review,拦住了谁? -- 肘子的 Swift 周报 #149
人工智能·swiftui·swift
大熊猫侯佩10 天前
Xcode 预览新升级:arguments 让界面调试井井有条
swiftui·xcode·swift
大熊猫侯佩11 天前
WWDC26:把 SwiftUI Toolbar 真正握在手心里
swiftui·swift·apple
大熊猫侯佩11 天前
WWDC 26 全新 ResultsObserver:终于能在 View 外面盯着 SwiftData 了
swiftui·swift·apple
东坡肘子12 天前
Apple Intelligence 已通过审核,即将在中国提供服务 -- 肘子的 Swift 周报 #148
人工智能·swiftui·swift
2501_9151063217 天前
SwiftUI项目创建详解:使用Xcode从零开始创建第一个App项目
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
东坡肘子19 天前
热茶还是冰咖啡 -- 肘子的 Swift 周报 #147
人工智能·swiftui·swift
2501_9160074723 天前
SwiftUI 声明式语法与 Xcode 预览功能详解
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
东坡肘子1 个月前
不是模型变慢了,是任务变大了 -- 肘子的 Swift 周报 #146
人工智能·swiftui·swift
Lvan的前端笔记1 个月前
SwiftUI:iOS 常用视图组件速查
ios·swiftui·swift