var person: Person? // actually @ObservedObject does not allowed optional
var body: some View {
VStack {
if person != nil {
// same as before
}
personViewIfExists() // << just extract it in helper function
}
}
private func personViewIfExists() -> some View { // generates view conditionally
if let p = person {
return ExistedPersonView(person: p) // << just for demo
}
}
在某些情况下,可能还需要以下函数变量(尽管它产生相同的结果)
private func personViewIfExists() -> some View {
if let p = person {
return AnyView(ExistedPersonView(person: p))
}
return AnyView(EmptyView())
}
var body: some View {
IfLet(pieceOfData) { realData in
// realData is no longer optional
}
}
格式 如果 您 的 可选 选项 是 nil , 是否 需要 回应 ?
var body: some View {
IfLet(pieceOfData, whenPresent: { realData in
// realData is no longer optional
DataView(realData)
}, whenNil: {
EmptyDataView()
})
}
3条答案
按热度按时间u1ehiz5o1#
是的,代码快照中要求的符号是不允许的,至少目前是这样,但通过以下非常简单的方法-将控制流提取到函数中,可以实现预期的结果:
在某些情况下,可能还需要以下函数变量(尽管它产生相同的结果)
2q5ifsrm2#
您 可以 使用 普通 Swift
if let
:中 的 每 一 个
或者 您 可以 创建 自己 的
IfLet
视图 构建 器 :格式
现在 , 您 可以 使用 此 工具 执行 以下 操作 :
格式
如果 您 的 可选 选项 是
nil
, 是否 需要 回应 ?格式
ryevplcw3#
更简单的方法是使用
.map()
如果
user
有值,它将显示UserProfile
,如果user
为nil,则不显示任何内容:如果你想为nil值提供一个默认的视图,你可以只使用nil-coalescing操作符:
然而,这要求两个视图是相同类型的,实际上,如果它们是相同类型的,最好只写
UserProfile(user: $0 ?? .default)
。有趣的是,两个视图的类型不同。您可以通过将它们 Package 在
AnyView
中来删除它们的类型,但在这一点上确实有点麻烦和难以阅读:因此,在本例中,我首选的方法是使用一个自定义的
IfLet
结构体(与Procrastin 8的名称相同,但实现和语法不同),它允许我编写类似于下面这样的内容,我发现它的意图非常明确,而且易于键入。IfLet
组件的代码如下所示。好好享受吧!