我正在尝试在SwiftUI中实现以下内容:
struct PersonView: View {
@State private var age: Int? = 0
var body: some View {
VStack {
Text("Just a test")
if let self.age > 0 {
Text("Display Age: \(age)")
} else {
Text("Age must be greater than 0!")
}
}
}
}
但是,在SwiftUI中,if let
会导致以下错误:
包含控制流语句的闭包不能与函数构建器 'ViewBuilder'一起使用
因此,在研究了这个问题之后,我发现建议使用.map
来展开age
可选项。 因此,我已经修改了VStack
中的代码如下:
Text("Just a test")
self.age.map {elem in
if elem > 0 {
Text("Display Age: \(elem)")
} else {
Text("Age must be greater than 0!")
}
}
然而,在.map
闭包中包含一个条件语句,会导致在调用VStack
的行处出现以下错误:
'(ViewBuilder.Type) -> (C0, C1) -> TupleView<(C0, C1)>' 要求 '()' 符合 'View'
类型 '()' 不符合协议 'View'
有没有什么建议可以解决第二组错误?或者,是否有其他方法可以在SwiftUI中拆开可选项并对其进行评估?我真的很喜欢SwiftUI,但不敢相信拆开可选项会成为一个头疼的问题!
if let
条件失败时尝试提供EmptyView()
,则此方法无效。因此,建议使用.map可能更可取,如@LuLuGaGa所建议的那样。 - Ever UribeString
,那么最简单的方法(在实现和结果视图层次结构方面)就是只有一个var
根据条件返回字符串,并且只有一个Text
来显示它。例如Mojtaba的答案中的第二个解决方案。 - shim