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
相关产品推荐
相关产品推荐

