SwiftUI 中的“some”关键字是什么?


SwiftUI 中的“some”关键字用于指示某个类型符合某个协议,但没有指定具体的符合类型。AnyView 类型是一种类型擦除视图,可以表示符合 View 协议的任何视图,通常与它一起使用。

SwiftUI 将 some View 定义为一种类型,它可以在不识别特定视图类型的情况下表示符合 View 协议的任何视图。这使得代码更通用和灵活。

换句话说,some 关键字用于声明不透明类型。在 Swift 5.1 版本中,它随着不透明返回类型的支持而引入。

什么是“不透明类型”?

当您使用不透明类型时,意味着您可以声明预期的返回类型,而无需定义确切的类型。

例如,您可以使用 some View 创建一个可以保存任何视图的变量,而无需知道该视图的具体类型。以下是一个示例

let anyView: some View = Text("Hello, World!")

这将创建一个名为 anyView 的变量,该变量可以保存符合 View 协议的任何视图,并将其值设置为显示字符串“Hello, World!”的 Text 视图。

为了创建一个可以保存符合某个协议的任何类型的变量,而无需知道它将携带的特定类型,some 关键字用作类型约束。

返回不透明类型而不匹配确切类型

如果我们不返回确切的类型会发生什么?在这种情况下,您将收到如下所示的错误。

示例

包含错误的代码示例如下所示:

import SwiftUI
func makeHeaderView(isProUser: Bool) -> some View {
   if isProUser {
      return Text("You have a premium membership !!") // return type is Text
   } else {
      return VStack { // Return type is VStack)>>
         Text("Do you want to become a PRO user?")
         Button("Become PRO", action: {
            // write action code
         })
      }
   }
}

输出

此代码将给您一个如下所示的错误

error: function declares an opaque return type 'some View', but the return statements in its body do not have matching underlying types

如您在上面的代码中看到的,我们正在返回两种类型的数据。为 PRO 用户返回 Text,为非高级用户返回 VStack。

在这种情况下,编译器希望通过“some”关键字了解底层的具体类型。为了在同一方法范围内返回不同的类型,必须为该值的范围修复不透明类型。

我们可以通过使用包装容器(如 VStack)来解决上述代码

import SwiftUI
func makeHeaderView(isProUser: Bool) -> some View {
   VStack {
      if isProUser {
         Text("You have a premium membership !!") // return type is Text
      } else {
         Text("Do you want to become a PRO user?")
         Button("Become PRO", action: {
            // write action code
         })
      }
   }
}

我们添加了一个额外的容器,只有当 isProUser 属性返回 true 时才需要它。在上面的代码中,与其使用结果构建器,不如使用 @ViewBuilder 属性重写它:

import SwiftUI
@ViewBuilder
func makeHeaderView(isProUser: Bool) -> some View {
   if isProUser {
      Text("You have a premium membership !!") // return type is Text
   } else {
      Text("Do you want to become a PRO user?")
      Button("Become PRO", action: {
         // write action code
      })
   }
}

结论

总之,SwiftUI 中的“some”关键字用于告诉编译器返回类型,而不告诉返回视图的确切类型。这样,您可以隐藏关键信息。

为了返回“some”类型,您可以使用包装器作为容器。此外,您可以使用 @ViewBuilder 属性代替结果构建器。

更新于: 2023 年 2 月 28 日

1K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告

© . All rights reserved.