Swift UI 教程错误“包含控制流语句的闭包不能与函数构建器‘ViewBuilder’一起使用”

mso*_*iku 6 swift swiftui swiftui-list swiftui-navigationlink swiftui-foreach

我尝试了 swiftUI 教程“处理用户输入”。

https://developer.apple.com/tutorials/swiftui/handling-user-input

使用“For”而不是“For Each”实现。但是会出现错误“包含控制流语句的闭包不能与函数构建器‘ViewBuilder’一起使用”。

我怎么做?

从:

import SwiftUI

struct LandmarkList: View {
    @State var showFavoritesOnly = true
    
    var body: some View {
        NavigationView{
            List{
                Toggle(isOn: $showFavoritesOnly){
                    Text("Show FavatiteOnly")
                }
                
                ForEach(landmarkData) { landmark in
                    if !self.showFavoritesOnly || landmark.isFavorite {
                            NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                                LandmarkRow(landmark: landmark)
                            }
                        }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至(我写道):

import SwiftUI

struct LandmarkList: View {
    @State var showFavoritesOnly = true
    
    var body: some View {
        NavigationView{
            List{
                Toggle(isOn: $showFavoritesOnly){
                    Text("Show FavatiteOnly")
                }
                
                for landmark in landmarkData {
                    if $showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(destination: LandmarkDetail(landmark: landmark)){
                            LandmarkRow(landmark: landmark)}
                        }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 18

符合ForEachView因此从本质上讲,它View就像 a 一样TextField对于每个关系

你不能使用普通的for-in,因为它ViewBuilder不理解什么是命令式 for 循环。可以ViewBuilder理解其他控制流,例如if,if-else或分别if let使用buildEither(first:)buildEither(second:)buildif(_:) 。


Tam*_*gel 6

尝试注释掉 if 语句,Xcode 可能会向您揭示真正的错误。下面是一个示例:由于传递给我的视图之一的枚举缺少关联值,我收到此错误。

这是之前和之后的样子:

Group {
    if let value = valueOrNil {
        FooView(
            bar: [
                .baz(arg1: 0, arg2: 3)
            ]
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

Group {
    if let value = valueOrNil {
        FooView(
            bar: [
                .baz(arg1: 0, arg2: 3, arg3: 6)
            ]
        )
    }
}
Run Code Online (Sandbox Code Playgroud)