包含声明的闭包不能与函数构建器“ ViewBuilder”一起使用

时间:2019-11-10 14:34:15

标签: swift swiftui

我无法在swift ui视图块内声明变量

 var body: some View {
     let isHuman = false
     Text("Levels \(isHuman)")
 }

3 个答案:

答案 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
        
    }
    
}