【问题标题】:Swift UI tutorial ERROR "Closure containing control flow statement cannot be used with function builder 'ViewBuilder'"Swift UI 教程错误“包含控制流语句的闭包不能与函数构建器'ViewBuilder'一起使用”
【发布时间】:2020-06-28 02:12:15
【问题描述】:

我尝试了 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"))
        }
    }
}

致(我写的):

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"))
        }
    }
}

【问题讨论】:

  • ForEach 是一个特殊的视图,但for 是控制流语句,在您尝试将其放入的 ViewBuilder 中是不允许的。
  • 为什么要使用forForEach 视图的存在正是因为常规的for 循环不能在视图构建器函数中使用。但是,对于 for 循环,您确实无法使用 ForEach 进行任何操作,因此了解您想要实现的目标将有助于我们回答您的问题。

标签: swift swiftui swiftui-list swiftui-navigationlink swiftui-foreach


【解决方案1】:

ForEach 确认为View,所以在其核心,它是View,就像TextFieldForEach Relationships

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多