【问题标题】:I got this error trying to create a While loop in swift: Closure containing control flow statement cannot be used with result builder 'ViewBuilder'我在 swift 中尝试创建 While 循环时遇到此错误:包含控制流语句的闭包不能与结果生成器“ViewBuilder”一起使用
【发布时间】:2025-11-28 21:25:02
【问题描述】:

我正在尝试创建一个获取当前时间的快速应用程序,然后创建一个在午夜结束的倒计时。这是我的第一个 swift 项目,我真的不知道发生了什么。如果有人可以帮助我,我将不胜感激,谢谢!

我得到的错误:Closure contains control flow statement cannot be used with result builder 'ViewBuilder'

代码:

//
//  ContentView.swift
//  RealClock
//
//  Created by Milos Dragan Ivancic Santana on 3/1/22.
//

import SwiftUI

struct ContentView: View {
    
    @State var hour = Calendar.current.component(.hour, from: Date())
    @State var minute = Calendar.current.component(.minute, from: Date())
    @State var second = Calendar.current.component(.second, from: Date())
    @State var realHour:Int = 0
    @State var realMinute:Int = 0
    @State var realSecond:Int = 0
    @State var isTimeShown:Bool = false
    
    func time() {
        realHour = 24-hour
        realMinute = 60-minute
        realSecond = 60-second
    }
    
    var body: some View {
        
            ZStack {
                
                VStack{
                    
                    Spacer()
                    
                    HStack {
                    
                            
                        while true { **I get the error here**
                            if isTimeShown {
                                
                                Text(String(realHour))
                                Text(":")
                                Text(String(realMinute))
                                Text(":")
                                Text(String(realSecond))
                                
                            }
                        }
                        
                    }.padding(.bottom, 100)
                    
                    HStack {
                       
                        Button {
                            
                            Timer.scheduledTimer(withTimeInterval: 0, repeats: false) {
                                
                                    Timer in
                                
                                    time()
                                    isTimeShown = true
                                                            
                                
                                
                                    
                                    
                            }
                            } label: {
                                
                                Text("Press")
                                
                                
                        
                        }
                               
                        }
                     
                    Spacer()
                }
                
                
                
                
            }
            
        }
        
    }

    

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
        ContentView()
        }
    }
}

【问题讨论】:

  • 错误很明显,您不能在body 中使用while 查看TimelineView

标签: ios swift while-loop swiftui control-flow


【解决方案1】:

您不能在视图中使用 while 或 for 循环。但是,由于您创建了 realHourrealMinuterealSecond @State 变量,因此它们会在视图发生变化时更新!只需删除 while 循环即可,只要按下“Press”按钮,值就会更新。正如所写,它们只更新一次,因为time() 函数每次都使用相同的小时、分钟和秒值。要使该函数多次工作,您需要将函数带入函数中,如下所示:

func time() {
    realHour = 24 - Calendar.current.component(.hour, from: Date())
    realMinute = 60 - Calendar.current.component(.minute, from: Date())
    realSecond = 60 - Calendar.current.component(.second, from: Date())
}

或者让他们computed properties,像这样:

var hour: Int { Calendar.current.component(.hour, from: Date()) }
var minute: Int { Calendar.current.component(.minute, from: Date()) }
var second: Int { Calendar.current.component(.second, from: Date()) }

我在下面包含了完整的代码。

正如 cmets 中提到的,如果您想完全绕过“按下”按钮,timelineView 可能就是您想要的。我还建议查看计时器;似乎您可以完全删除它(将行保留在里面),至少使用您发布的代码。

以下是适合我的完整代码:

import SwiftUI

struct ContentView: View {
    
    var hour: Int { Calendar.current.component(.hour, from: Date()) }
    var minute: Int { Calendar.current.component(.minute, from: Date()) }
    var second: Int { Calendar.current.component(.second, from: Date()) }
    @State var realHour:Int = 0
    @State var realMinute:Int = 0
    @State var realSecond:Int = 0
    @State var isTimeShown:Bool = false
    
    func time() {
        realHour = 24-hour
        realMinute = 60-minute
        realSecond = 60-second
    }
    
    var body: some View {
        ZStack {
            VStack{
                Spacer()
                HStack {
                    if isTimeShown {
                        Text(String(realHour))
                        Text(":")
                        Text(String(realMinute))
                        Text(":")
                        Text(String(realSecond))
                    }
                }
            }.padding(.bottom, 100)
            HStack {
                Button {
                    Timer.scheduledTimer(withTimeInterval: 0, repeats: false) {
                        Timer in
                        time()
                        isTimeShown = true
                    }
                } label: {
                    Text("Press")
                }
            }
            Spacer()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
        ContentView()
        }
    }
}

【讨论】:

  • 它现在对我有用...代码现在没有任何错误(没有 while 循环)但是当我运行程序时它显示了距离午夜的时间但它没有改变:(无论如何谢谢你的帮助:)
  • 你改变时间功能了吗?如果您只删除了 while 循环,那么您拥有的时间函数会从原始的小时/分钟/秒中提取,每次都不会改变。
最近更新 更多