惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
L
LangChain Blog
博客园 - 司徒正美
G
Google Developers Blog
博客园 - 【当耐特】
GbyAI
GbyAI
月光博客
月光博客
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net
大猫的无限游戏
大猫的无限游戏
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
D
Docker
MongoDB | Blog
MongoDB | Blog
Vercel News
Vercel News
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
博客园 - 聂微东

回忆中的明天

自己写一个Web 端的MiMo TTS Chat,方便实现文本转语音,API限免中 · 回忆中的明天 NVIDIA NIM 开发平台,提供超多免费大模型 · 回忆中的明天 iTranslation 简单快捷的翻译软件,支持数十种语言互译 · 回忆中的明天 国内外免费大模型平台,支持 API 调用的超多免费大模型 · 回忆中的明天 SiliconFlow 硅基流动一站式大模型云服务平台,提供超多免费大模型 · 回忆中的明天 Xiaomi MiMo 小米大模型团队开发的大语言模型,开源限免中…… · 回忆中的明天 BigModel 智谱大模型开放平台,提供超多自研免费大模型 · 回忆中的明天 OpenRouter 模型聚合平台,提供超多免费模型使用 · 回忆中的明天 iReader 英语点读学习系统,译林小学英语在线点读 · 回忆中的明天 ZenMux 企业级大模型聚合平台,提供免费试用模型 Gemini 3 Pro · 回忆中的明天 英语学习,新概念英语在线点读、全文朗读学习系统 · 回忆中的明天 iGSTT(Gemini STT) 开源免费的语音转文本(STT)的命令行工具 · 回忆中的明天 Python 项目打包,并上传到 PyPI,分享项目 · 回忆中的明天 iGTTS(Gemini TTS) 开源免费的文本转语音(TTS)的命令行工具 · 回忆中的明天 iChat(AI Chat) 智能聊天工具,支持 MiMo、DeepSeek、Gemini、Grok、OpenAI和自定义AI · 回忆中的明天 NanoPi R2S 安装 Debian 固件系统,旁路由网络代理内网转发,决解直连网络卡顿 nftables · 回忆中的明天 NanoPi R2S Armbian Linux 旁路由网络代理内网转发,决解直连网络卡顿 iptables · 回忆中的明天 sing-box rule-set · 回忆中的明天 Xcode 最全最实用的快捷键列表 · 回忆中的明天 免费的图床服务器-GitHub Pages · 回忆中的明天 A Free Native Image Uploading Tool for macOS · 回忆中的明天 免费的图床服务器-Cloudflare-R2 · 回忆中的明天 图传 (iUploader) - macOS 免费原生图床上传利器 · 回忆中的明天 本地无法加载托管到Cloudflare中的图片等资源,权限错误403 · 回忆中的明天 国内、外免费公共的DNS,支持的DoH,防止污染、篡改的问题 · 回忆中的明天 macOS 系统下载和安装 · 回忆中的明天 使用 CURL 命令调试和诊断网络问题,网站请求测速 · 回忆中的明天 WARP Beta for macOS 支持新协议 MASQUE · 回忆中的明天 2024年自用国外靠谱的 VPS 服务器推荐 · 回忆中的明天 使用 OpenCore,让你的旧 Mac 用上最新的 macOS 系统 · 回忆中的明天
SwiftUI 中的@State、@Bindable和@Binding · 回忆中的明天
2025-04-02 · via 回忆中的明天

原文:https://ichochy.com/posts/swift/20250402.html


在 SwiftUI 中,@State@Bindable 和 @Binding 都用于管理和传递状态,但它们适用于不同的使用场景。


1. @State(本地状态)

@State 用于管理 视图本地的可变状态,该状态只属于当前视图,并且由 SwiftUI 负责存储和更新。

特点:

  • 只能用于 结构体(struct)视图,因为 SwiftUI 视图是值类型。

  • 适用于 视图内部的小型状态,如按钮点击状态、输入框文本等。

  • 只能在 当前视图 中使用,不能直接传递给子视图。

示例:

struct CounterView: View {
    @State private var count = 0  // 本地状态

    var body: some View {
        VStack {
            Text("计数: \(count)")
            Button("增加") {
                count += 1  // 修改 @State 变量,SwiftUI 重新渲染视图
            }
        }
    }
}

2. @Binding(状态绑定)

@Binding 用于 子视图获取父视图的状态,它本身不存储数据,而是引用 外部的状态(通常是 @State)

特点:

  • @Binding 不拥有数据,而是对外部数据的引用。

  • 用于 子视图修改父视图的状态,避免数据复制。

  • 适用于 控制组件、表单、滑块等需要修改外部状态的视图

示例:


struct ParentView: View {
    @State private var isOn = false  // 本地状态

    var body: some View {
        ToggleView(isOn: $isOn)  // 传递 @Binding
    }
}

struct ToggleView: View {
    @Binding var isOn: Bool  // 绑定外部的状态

    var body: some View {
        Toggle("开关状态", isOn: $isOn)  // 直接修改外部状态
    }
}

@Binding 前面要加 $ 取 绑定值,在子视图内部可直接读写该值。


3. @Bindable(可绑定的对象)【iOS 17+

@Bindable 用于绑定 Observable 对象(通常是 ObservableObject),让 SwiftUI 视图可以自动响应对象属性的变化。

特点:

  • 作用类似 @Binding,但适用于 类对象(Observable)

  • 依赖 Observable 协议(iOS 17 引入)。

  • 适用于 需要双向绑定的复杂数据对象

示例(结合 Observable)

import SwiftUI

@Observable class UserSettings {
    var username: String = "张三"
}

struct ContentView: View {
    @State private var settings = UserSettings()  // `@State` 管理对象

    var body: some View {
        EditView(settings: $settings)  // 传递 `@Bindable`
    }
}

struct EditView: View {
    @Bindable var settings: UserSettings  // 绑定 Observable 对象

    var body: some View {
        TextField("用户名", text: $settings.username)  // 绑定属性
    }
}

这里 @Bindable var settings: UserSettings 允许 EditView 直接修改 settings.username,并且 SwiftUI 会自动更新 ContentView。


对比总结

属性修饰符 数据存储 作用范围 适用场景
@State 视图内部 仅当前视图 视图局部状态
@Binding 外部状态(引用) 子视图 子视图修改父视图状态
@Bindable Observable 对象 子视图 绑定 Observable 类属性,适用于复杂数据

使用建议:

  • 简单数据(计数、布尔值):用 @State。

  • 子视图修改父视图的状态:用 @Binding。

  • 对象(类)状态 且 多个视图共享:用 @Bindable(iOS 17+)。

  • iOS 16 及以下,用 @ObservedObject 代替 @Bindable(结合 ObservableObject)。