gpt4 book ai didi

swift - 为什么 EnvironmentKey 有一个 defaultValue 属性?

转载 作者:行者123 更新时间:2023-12-03 09:25:43 28 4
gpt4 key购买 nike

这是 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()
}
}

您会发现 SwiftUI 经常调用此属性(因此,在实践中,我将我的 defaultValue 定义为 static let )。

当您在 print 语句上添加断点并向下移动堆栈时,它会在下面的箭头处停止:
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的内部实现需要在确定实际值之前设置此默认值,以避免使变量声明可选。

最后,我还尝试添加 @EnvironmentObservableObject希望它可以访问与 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()
}

SwiftUI View 和任何其他类都可以使用相同的实例,但我不确定它在任何方面都有用。

那么 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com