Swift 中学习笔记一、Swift 中的是什么很多 Java 开发者第一次看到 Swift 会认为StateBindingMainActorViewBuilder是不是和 Java 的 Annotation注解一样答案不是。Java 的更多表示元数据Metadata而 Swift 的表示语言特性Language Feature很多情况下会直接影响编译器如何生成代码、如何检查代码甚至如何运行代码。一句话总结Java Annotation 是告诉编译器或框架一些信息Swift 的往往会改变代码本身的行为。二、Java Annotation 与 Swift 的区别Java例如Overridepublicvoidrun(){}作用提示编译器检查是否真的重写了父类方法不改变方法本身大量依赖反射Reflection和框架如 Spring例如AutowiredprivateUserServiceservice;真正完成注入的是 Spring而不是 Java 编译器。Swift例如Stateprivatevarcount0这不是一个普通变量。编译器会自动改写成类似下面的代码简化privatevar_countState(initialValue:0)varcount:Int{get{_count.wrappedValue}set{_count.wrappedValuenewValue}}所以count1实际上修改的是StateInt.wrappedValue而不是普通的 Int。三、Swift 中常见的 分类Swift 的大致可以分为四类。第一类Property Wrapper属性包装器这是 SwiftUI 最重要的一类。例如StateBindingEnvironmentEnvironmentObjectAppStorageSceneStorageFocusState作用包装变量改变变量的行为。例如Statevarcount0不是普通变量而是一个能够通知 SwiftUI 刷新界面的状态对象。为什么需要 Property Wrapper例如普通变量varcount0修改以后count1SwiftUI 根本不知道。但是Statevarcount0修改以后count1SwiftUI 会收到通知状态改变 ↓ 重新计算 body ↓ 刷新界面第二类Result Builder结果构建器代表ViewBuilder例如VStack{Text(Hello)Image(systemName:star)}为什么中间没有逗号因为ViewBuilder告诉编译器不要按普通 Closure 编译。而是自动转换成ViewBuilder.buildBlock(Text(Hello),Image(...))因此Text()Image()Button()最终仍然返回一个 View。Result Builder 是 Swift DSL领域特定语言的核心。除了 SwiftUI还用于RegexBuilderPredicateBuilder自定义 DSL第三类Concurrency并发代表MainActorSendable例如MainActorfuncupdateUI(){}表示这个方法只能运行在主线程。如果后台线程调用编译器会直接检查并提示错误。所以这不是注解而是真正改变代码运行规则。第四类Compiler Attributes编译器属性例如available(iOS17,*)表示最低支持版本。还有discardableResultinlinableusableFromInlinefrozen它们主要影响编译优化API 可见性平台兼容性四、最经典的几个 State用于View 自己拥有的数据。例如Stateprivatevarcount0特点生命周期跟随 View修改以后自动刷新 UIBinding用于父子 View 共享状态。例如父Statevarname子Bindingvarname:String修改子 View父 View 数据同步变化。Environment用于从环境读取数据。例如Environment(\.dismiss)privatevardismiss或者Environment(\.colorScheme)varcolorSchemeEnvironmentObject用于整个 View 树共享对象。例如EnvironmentObjectvaruser:UserModel不需要层层传递参数。Observable现代 SwiftUIiOS 17 以后推荐。例如ObservableclassUser{varname}SwiftUI 可以自动追踪数据变化。MainActor保证所有代码都运行在主线程。适用于ViewModelUI 更新ViewBuilder让VStack{}这样的 DSL 成为可能。也是 SwiftUI 最核心的语法糖。五、自定义 Property WrapperSwift 允许自己写propertyWrapperstructUppercase{privatevarvaluevarwrappedValue:String{get{value}set{valuenewValue.uppercased()}}}使用Uppercasevarnamehello最终name HELLO这说明State其实只是苹果实现好的一个 Property Wrapper。六、自定义 Result Builder也可以自己写resultBuilderstructMyBuilder{staticfuncbuildBlock(_components:String...)-[String]{components}}然后MyBuilderfunctest()-[String]{ABC}最终返回[A, B, C]这就是 SwiftUI DSL 的原理。七、学习顺序推荐第一阶段必须掌握StateBindingEnvironmentEnvironmentObject第二阶段理解 SwiftUIViewBuilderObservableBindableMainActor第三阶段深入 SwiftpropertyWrapperresultBuilderSendableavailable八、总结Java 的 Annotation ↓ Metadata ↓ Reflection ↓ Framework 使用特点更多是标记通常不改变语言语义Swift 的 Compiler Feature ↓ 代码生成 ↓ 语义检查 ↓ 语言能力主要包括Property WrapperResult BuilderActor / ConcurrencyCompiler Attribute因此Java 的 Annotation 更像告诉框架该做什么Swift 的更像告诉编译器按另一种规则生成和检查代码。理解了这些再学习 SwiftUI 中的State、Binding、ViewBuilder、MainActor等就不会再觉得它们是“魔法”而是 Swift 语言本身提供的高级能力。:::建议你下一篇学习笔记就写Property WrapperState的底层实现然后再写Result BuilderViewBuilder的编译原理。这两篇吃透之后SwiftUI 80% 的语法都会变得很自然。