SwiftUI中的@Environment和@EnvironmentObject有什么区别?
从我从文档中发现的内容来看,@ Environment似乎用于ColorScheme之类的全局依赖项。但是我找不到它们之间的确切区别。例如,它们可以互换使用吗?
答案 0 :(得分:5)
这是我为自己准备的笔记。可能有用,
@EnvironmentObject:
@环境:
谢谢
答案 1 :(得分:3)
@Enviroment,您可以访问属性值,例如用户设置(例如配色方案,布局方向等)或视图属性,例如EditMode或PresentationMode。 @EnviromentObject由您定义,可用于所有视图,对其的更改将驱动您视图的更新。
答案 2 :(得分:3)
我想在其他人的回答中添加一些东西。
@Environment
是 value 类型,而 @EnvironmentObject
是 reference 类型。
您只能在 @EnvironmentObject
中使用单个对象实例。如果您添加另一个对象实例,它将替换之前的实例。
但是作为 @Environment
键值对,只需确保键不同即可。
您只需要使用 @EnvironmentObject var object: Object
使对象从环境中检索实例,并通过 .environmentObject(Object())
注入实例
另一方面,有许多预定义的 @Environment
系统管理环境值。您也可以创建自定义的。它需要是 struct
类型并符合 EnvironmentKey
。
这是一个例子,
struct SunlightKey: EnvironmentKey {
static var defaultValue: Double = 1.09
}
然后将它添加到 EnvironmentValues
作为它的扩展。
这是一个基本示例
extension EnvironmentValues {
var sunlight: Double {
get { self[SunlightKey.self] }
set { self[SunlightKey.self] = newValue }
}
}
然后,在视图文件中使用它,例如 @Environment(\.sunlight) var sunlight
并通过 .environment(\.sunlight, 4.05)
希望,这有帮助
答案 3 :(得分:1)
System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
和@Environment
都是属性包装器,而@EnvironmentObject
保留带有预定义键的值,@Environment
不仅保留预定义键,还保留任意值。例如,如果您需要保留有关用户对象的信息,包括名称,年龄,性别等,则需要使用@EnvironmentObject
,而如果要保留设备是处于暗还是亮模式,则使用系统本地语言,日历首选项和编辑模式,非常适合使用@EnvironmentObject
。
@Environment
答案 4 :(得分:1)
@Environment
是一个键/值对,而@EnvironmentObject
只是一个由其类型标识的值。两者都是变量存储属性包装器。