在 Swift 中,@Environment 是一个属性包装器

13 min read

在 Swift 中,@Environment 是一个属性包装器,它允许您从视图层次结构中访问环境值。环境值是在视图外部设置的值,并且对其所有后代都可用。

例如,您可能会定义一个控制应用中所有文本的字体大小的环境值。然后,您可以使用 @Environment 属性包装器从应用中的任何视图访问此值,并使用它来设置该视图中显示的文本的字体大小。

要使用 @Environment 属性包装器,您首先需要定义一个 EnvironmentKey 类型,该类型指定您希望访问的环境值的类型。然后,您可以使用此密钥在视图中访问环境值。

下面是在视图中如何使用 @Environment 属性包装器的示例:

struct MyView: View {
    @Environment(\.fontSize) var fontSize: CGFloat

    var body: some View {
        Text("Hello, World!")
            .font(.system(size: fontSize))
    }
}

在此示例中,fontSize 属性设置为 fontSize 环境值的值,该值在 MyView 结构外设置。然后,您可以使用 fontSize 属性来设置视图中显示的文本的字体大小。

您还可以通过向 @Environment 属性包装器提供默认值来为环境值设置

使用反斜杠访问的 fontSize 环境值的值

在这个例子中,fontSize 属性被设置为使用反斜杠访问的 fontSize 环境值的值。然后,fontSize 环境值的值用于设置视图中显示的文本的字体大小。

如果没有反斜杠,则必须调用 EnvironmentKey 类型的 fontSize 键来访问 fontSize 环境值的值,如下所示:

struct MyView: View {
    @Environment(EnvironmentKey.fontSize) var fontSize: CGFloat

    var body: some View {
        Text("Hello, World!")
            .font(.system(size: fontSize))
        }
    }

使用反斜杠可以更轻松,更简洁地访问 fontSize 环境值的值。

EnvironmentKey 的值通常在使用该键的视图层次结构之外设置

EnvironmentKey 的值通常在使用该键的视图层次结构之外设置。这样就可以将值设置一次,并使其对层次结构中所有需要它的视图都可用。

要设置 EnvironmentKey 的值,您需要创建该键的实例并为其分配一个值。然后,您可以将此实例传递给视图的 environment 方法,该方法将为视图的所有后代设置键的值。

下面是在 SwiftUI 应用中如何设置 EnvironmentKey 的值的示例:

Copy code
struct ContentView: View {
    var body: some View {
        MyView()
            .environment(\.fontSize, 20)
    }
}

struct MyView: View {
    @Environment(\.fontSize) var fontSize: CGFloat

    var body: some View {
        Text("Hello, World!")
            .font(.system(size: fontSize))
    }
}

在此示例中,fontSize 环境键的值设置为 20,用于 MyView 及其所有后代。然后,可以使用 MyView 结构中的 @Environment 属性包装器访问此值。

您还可以在应用的 SceneDelegate 类中为 EnvironmentKey 设置全局值。这样就可以在应用的所有视图中使用 @Environment 属性包装器访问该值。