SwiftUI:结构视图vs @ViewBuilder

问题描述

如果我想在SwiftUI中呈现项目列表,则可以执行以下操作(使用XCode 12):

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            Lazyvstack {
                ForEach(texts.indices,id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    }

    struct MyRow: View {
        let label: String
        var body: some View {
            Text(label).font(.title3).padding()
        }
    }
}

MyRow可以不是一个结构,而可以是一个函数,从而使代码更加简洁和实用:

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            Lazyvstack {
                ForEach(texts.indices,id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    }

    @viewbuilder func MyRow(label: String) -> some View {
        Text(label).font(.title3).padding()
    }
}

我想了解两种方法间的区别。 在某些情况下,您会优先选择一个吗?

首先想到的是,您无法拥有具有函数@State属性,这意味着如果视图需要状态,则需要使用struct方法

就这些吗?在某些情况下,是否有一种方法在优化方面更好?调试?特征?可移植性?

解决方法

<div class="" style="flex-wrap: wrap; display: flex;"> {{ formset.management_form }} {% for form in formset %} {% csrf_token %} <div class="col "> <table style="border-radius: 21px;"> <p style="font-weight: 500;" class="question-text"> </p> <tr class="bubbles"> <td class="bubble-text-left">Not interested&nbsp;</td> {% for choice in form.value %} <td> <label class="container"> <input type="radio" name="{{ form.value.choice.name }}" value="{{ form.value.choice.0 }}" id='{{ form.value.choice.auto_id }}' class="{{ radio_input.choice_value }}"> <span class="checkmark"></span> </label> </td> {% endfor %} <td class="bubble-text-right">Very interested</td> </tr> </table> <br> </div> {{ form.id }} {{ form.question }} {% endfor %} </div> 通常用于有条件地渲染视图,而无需使用@ViewBuilder这样的解析器。引用Apple Developer's website:“此函数的客户端可以使用多语句闭包来提供多个子视图”。例如,如果您要显示取决于变量的视图,即,如果某个变量为true,则渲染View1,如果其为false,则渲染View2。