我无法在swift ui视图块内声明变量
var body: some View {
let isHuman = false
Text("Levels \(isHuman)")
}
答案 0 :(得分:3)
您不应在builder块内创建变量,而应在主体范围之外创建变量,
var isHuman = false
var body: some View {
Text("Levels \(isHuman)")
}
Swift UI使用功能构建器块,该块只能包含构建器可以理解的内容。 而且,它在赋予Swift声明式编程感觉方面也起着重要作用, 此功能的目的是允许在Swift中创建嵌入式DSL-允许您定义要转换为其他内容的内容
答案 1 :(得分:0)
还不错,您可以...是否真的需要它的另一个问题,但是当您真正需要时,您就知道可以。您只需要记住,视图构建器必须返回一些视图,并且在所有可能的分支中它必须为相同类型
var body: some View {
let value = "" // construct somewhere or something
return Text("Levels \(value)")
}
答案 2 :(得分:0)
我为当地人支付的两分钱,而且“表达过于复杂,无法在合理的时间内解决”
我确实在先前的嵌套循环中进行了预计算。
struct MyGridView : View {
var room: Room
let MaxRows = 2
let MaxCols = 2
var body: some View {
**// precalc, as GeometryReader calls its body loop twice**
let si = FirstLevelQuestionsManager.shared
var firstLevelQuestions = FirstLevelQuestions()
let devids = room.devids
for row in 0..<self.MaxRows {
for col in 0..<self.MaxCols {
let flq = si.titleAndTextAt(row: row, col: col, ncols: self.MaxCols)
firstLevelQuestions.append(flq)
}
}
let gr = GeometryReader { (geometry : GeometryProxy) in
VStack() {
ForEach(0..<self.MaxRows) { (row: Int) in
HStack {
ForEach(0..<self.MaxCols) { (col: Int) -> GridCellView in
let index = col + row * self.MaxCols
return GridCellView(
w: (geometry.size.width / CGFloat(self.MaxCols))
titleAndText: firstLevelQuestions[index],
room: self.room,
troubleShootings: troubleShootings[index] )
}
}
}
}
} // GeometryReader
return gr
}
}