
教程中使用 environment 来注入了一个 class 的实例 @StateObject var a = SomeClass(), 在某页面中(SwiftUI) 将这个 a 传递给一个子页面, 需要在子页面中使用 @Binding, 传递时候需要使用 $a 来传递它的 projectedValue.
我的疑惑: class 不是 reference 类型吗? 为什么还要这样传递? 比如:
class Foo { var a: String init(a: String) { self.a = a } } var foo = Foo(a: "aaa") print(foo.a) var bar = foo bar.a = "bbb" print(foo.a) // bbb func baz(f: Foo) { f.a = "xxx" } baz(f: bar) print(foo.a) // xxx 可能是因为 @StateObject 作用让它发生了变化? 为什么不直接使用 class 这种引用类型?
1 foxwe10 2022-09-15 16:55:05 +08:00 `Binding` 是一个 `struct`, 你可以看下 SwiftUI 关于 `Binding` 的声明 interface |
3 < href="/member/kanel" class="dark">kanel 2022-09-15 17:10:35 +08:00 @Binding 是要告系,的值改的候,重新刷新使用的 UI 元件 |
4 ethusdt OP @kanel 谢谢, 那这么说我就懂了, `@Published` `@State` `@Binding` 这三种方式可以让数据变化时候 UI 自动刷新, 如果直接传递引用, 不会触发刷新, 这么理解对吧. |
5 eric1202 2022-09-15 17:22:15 +08:00 响应式 接受值更改的通知 |
6 MakHoCheung 2022-09-15 17:29:05 +08:00 |
7 kanel 2022-09-15 17:36:22 +08:00 @FaiChou 抱歉,我了。 `@State` 才是的值改的候,重新刷新使用的 UI 元件。 `@Binding`是的性使用了`@Binding` Annotation 的候,用的性加上$,可以把 Binding<?>的型以被用的性行定,此值是按地址值的。 |
8 kanel 2022-09-15 17:51:04 +08:00 `@StateObject`是指 model 象只被建一次,不在以後新的 UI 生命期中重新建 model 象。 |
9 kanel 2022-09-15 17:52:47 +08:00 三者然都是用在 class 的上,但是前者跟後者不是在一概念上。 |
10 ethusdt OP |
11 kanel 2022-09-15 18:51:09 +08:00 因 View Struct 就是值的。 |
12 MakHoCheung 2022-09-15 19:21:38 +08:00 哦,传 @StateObject 的属性就要 @Binding 了 |
13 agagega 2022-09-17 13:07:33 +08:00 Palette 是 struct 吗 |