You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI用SwiftSoup报Closure containing control flow statement cannot be used with result builder 'ViewBuilder'错怎么办

问题根因

该报错由两个问题共同导致:

  • SwiftUI的body属性被ViewBuilder结果构建器修饰,要求必须返回合法的View类型,你的代码中body内部只有打印逻辑,没有返回任何视图
  • ViewBuilder构建的闭包默认不支持直接使用do/catch这类无视图返回的控制流语句
修复方案

将纯解析逻辑从body的视图声明部分移到视图生命周期回调onAppear的普通闭包中,同时保证body始终返回合法视图。

修正后的完整代码如下:

import SwiftUI
import SwiftSoup

struct ContentView: View {
    var body: some View {
        // 保证body返回合法视图,这里用测试文本占位
        Text("HTML解析测试")
            .onAppear {
                // onAppear的闭包不受ViewBuilder规则限制,可正常执行流程控制代码
                do {
                    let html = "<html><head><title>First parse</title></head>"
                        + "<body><p>Parsed HTML into a doc.</p></body></html>"
                    let doc: Document = try SwiftSoup.parse(html)
                    // 原代码rint为笔误,修正为print,同时避免强制解包崩溃
                    if let titleElement = try doc.select("title").first() {
                        print(titleElement)
                    }
                } catch Exception.Error(_, let message) {
                    print(message)
                } catch {
                    print("未知错误:\(error.localizedDescription)")
                }
            }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
扩展说明

如果需要将解析结果展示在界面上,可以通过@State属性存储解析结果,示例如下:

struct ContentView: View {
    // 存储解析得到的标题内容
    @State private var parsedTitle = ""
    
    var body: some View {
        // 直接展示解析结果
        Text(parsedTitle)
            .onAppear {
                do {
                    let html = "<html><head><title>First parse</title></head>"
                        + "<body><p>Parsed HTML into a doc.</p></body></html>"
                    let doc: Document = try SwiftSoup.parse(html)
                    if let titleElement = try doc.select("title").first() {
                        parsedTitle = try titleElement.text()
                    }
                } catch {
                    parsedTitle = "解析失败"
                    print(error.localizedDescription)
                }
            }
    }
}

内容的提问来源于stack exchange,提问作者sultan.h

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:06:03