据我所知,你不能使用if let不可选的变量......
func run() {\n let title = "Hello, world!"\n if let title = title { /// Initializer for conditional binding must have Optional type, not \'String\'\n print(title)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n...但由于某种原因,当它位于闭包内时,它会起作用:
\nfunc run() {\n let title = "Hello, world!"\n let closure = {\n if let title = title { /// No error!\n print(title)\n }\n }\n closure()\n}\nRun Code Online (Sandbox Code Playgroud)\n这是在 Xcode 14.0 beta (14A5228q) 上。这是一个错误,还是一个功能?当我在Xcode 13.3(13E113)上测试时,错误再次出现。
\n顺便说一句,以下 SwiftUI 代码在 Xcode 13 和 Xcode 14 上都可以正常编译:
\nstruct ContentView: View {\n let title = "Hello, world!"\n\n var body: some View {\n VStack {\n if let title = title { /// Works fine!\n Text(title)\n }\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n而且不仅仅是VStack\xe2\x80\x94 任何标记的东西@ViewBuilder似乎都有效。
struct ContentView: View {\n let title = "Hello, world!"\n\n var body: some View {\n ContainerView {\n if let title = title { /// works fine!\n Text(title)\n }\n }\n }\n}\n\nstruct ContainerView<Content: View>: View {\n @ViewBuilder var content: Content\n var body: some View {\n content\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这是已记录的功能还是错误?
\n该问题(与结果生成器有关)已在 Swift 5.8 中修复。据GitHub上的一位 Apple 工程师介绍:
这是 5.7 中的一个错误,之前已编译并影响编译时性能。我在论坛帖子中概述了这个问题 - https://forums.swift.org/t/improved-result-builder-implementation-in-swift-5-8/63192 “结构诊断”小节。