a) 在非常简单的情况下,使用可选的后备或带有强制解包的 if 检查(if
在 View Builder 块中允许):
struct OptionalsExampleView: View {
var person : Person? = Person(name: "Bob")
var body: some View {
VStack() {
Text(person?.name ?? "")
if person != nil {
Text("Name:")
Text(person!.name)
}
}
}
}
b) Use Optional#map
如果存在单个可选值,则显示单个视图:
struct OptionalsMapExampleView: View {
var person : Person? = Person(name: "Bob")
var body: some View {
VStack() {
person.map { person in
VStack {
Text("Name:")
Text(person.name)
}
}
}
}
}
c) 包裹if let
具有显式返回类型的组视图中的块。if let
如果它是视图生成器块中的唯一语句,则此处允许。如果块可以返回不同的视图类型,则视图需要包装为AnyView
:
struct OptionalsGroupExampleView: View {
var person: Person? = Person(name: "Bob")
var body: some View {
VStack {
Group { () -> AnyView in
if let person = person {
return AnyView(VStack {
Text("Name:")
Text(person.name)
})
} else {
return AnyView(EmptyView())
}
}
}
}
}
d) 将逻辑提取到一个单独的函数中 -if let
此处允许,因为它位于视图构建器块之外。如果函数可以返回不同的视图类型,则需要将视图包装为AnyView
:
struct OptionalsFuncExampleView: View {
var person : Person? = Person(name: "Bob")
var body: some View {
VStack() {
personView()
}
}
func personView() -> some View {
if let person = person {
return AnyView(
VStack {
Text("Name:")
Text(person.name)
}
)
} else {
return AnyView(EmptyView())
}
}
}
e) 使用封装 if-let 条件的辅助 View 类型,示例实现:IfLet https://stackoverflow.com/a/60203901/128083 / OptionalView https://medium.com/@garsdle/unwrapping-optionals-in-swiftui-7563dcc200e7;也可用作函数ifLet https://stackoverflow.com/questions/60223711/how-to-set-default-clouse-param-in-view-method/60225784#60225784.