Swift 5.7 - `if let` 适用于闭包内的非可选值

ahe*_*eze 6 swift swiftui

据我所知,你不能使用if let不可选的变量......

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

...但由于某种原因,当它位于闭包内时,它会起作用:

\n
func run() {\n    let title = "Hello, world!"\n    let closure = {\n        if let title = title { /// No error!\n            print(title)\n        }\n    }\n    closure()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是在 Xcode 14.0 beta (14A5228q) 上。这是一个错误,还是一个功能?当我在Xcode 13.3(13E113)上测试时,错误再次出现。

\n
\n

顺便说一句,以下 SwiftUI 代码在 Xcode 13 和 Xcode 14 上都可以正常编译:

\n
struct 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}\n
Run Code Online (Sandbox Code Playgroud)\n

而且不仅仅是VStack\xe2\x80\x94 任何标记的东西@ViewBuilder似乎都有效。

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

“你好世界!”  显示的

\n

这是已记录的功能还是错误?

\n

ahe*_*eze 3

该问题(与结果生成器有关)已在 Swift 5.8 中修复。据GitHub上的一位 Apple 工程师介绍:

这是 5.7 中的一个错误,之前已编译并影响编译时性能。我在论坛帖子中概述了这个问题 - https://forums.swift.org/t/improved-result-builder-implementation-in-swift-5-8/63192 “结构诊断”小节。