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 属性代替结果构建器。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP