作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是 EnvironmentKey
的定义:
public protocol EnvironmentKey {
associatedtype Value
static var defaultValue: Self.Value { get }
}
defaultValue
的目的感到困惑。属性(property)。或者我对
@Environment
的预期用途感到困惑。 .让我解释...
defaultValue
正在被访问。例如,如果您定义
defaultValue
作为 setter/getter :
protocol MyInjector: EnvironmentKey {
static var defaultValue: Foo {
print("get default value!")
return Foo()
}
}
defaultValue
定义为
static let
)。
extension EnvironmentValues {
var myInjector: Foo {
get { self[MyInjector.self] } <-----------------
set { self[MyInjector.self] = newValue }
}
}
init
中的行我在哪里访问以下变量:
@Environment(\.myInjector) var foo: Foo
defaultValue
任何时候使用
@Environment
的 SwiftUI View 变量被重新渲染。
@Environment
的内部实现需要在确定实际值之前设置此默认值,以避免使变量声明可选。
@Environment
到
ObservableObject
希望它可以访问与 SwiftUI View 树相同的“环境”。
class Bar: ObservableObject {
@Environmenet(\.myInjector var foo: Foo
}
Bar
的实例并非如此。收到的实例与我通过
View.environment(\.myInjector, Foo())
注入(inject)的实例不同.
@Environment
使用共享变量模式注入(inject)全局单例:
protocol MyInjector: EnvironmentKey {
static let defaultValue = Foo()
}
defaultValue
的目的是什么? ?正如我所怀疑的那样,是不是很简单,以便内部实现可以在确定真实值之前为变量分配任意值,还是还有其他事情发生?
最佳答案
IMO 有两个理由拥有 defaultValue
在这种模式下(我认为这是意图):
1) 指定对应的值类型
2) 使环境值始终有效(使用 @Environment
)
在 SwiftUI: Set Status Bar Color For a Specific View发布后您可以找到此 defaultValue
的用法示例通过环境轻松连接应用程序的不同部分的功能。
关于swift - 为什么 EnvironmentKey 有一个 defaultValue 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586767/
这是 EnvironmentKey 的定义: public protocol EnvironmentKey { associatedtype Value static var defa
我是一名优秀的程序员,十分优秀!