当只有一个值时,Function Builder 不工作?

Function Builder not working when only one value?

我有一个 functionBuilder

@_functionBuilder
struct MyBuilder {
    static func buildBlock(_ numbers: Int...) -> Int {
        var result = 0
        for number in numbers {
            result += number * 2
        }
        return result
    }
}

函数

func myFunc(@MyBuilder builder: () -> Int) -> Int {
    builder()
}

使用

let a = myFunc {
    10
    20
}
print(a) // print 60 is work!

但是

let b = myFunc {
    10
}
print(b) // print 10?

为什么 b 不是 20?

我尝试添加其他 buildBlock

static func buildBlock(number: Int) -> Int {
    return number * 2
}

但不工作:(

有什么想法吗?

Any idea?

失败案例中发生的事情是 { 10 } 直接被视为类型 () -> Int 的闭包,编译器似乎根本没有考虑函数构建器。生成的代码只是一个 returns 10.

的函数

这似乎是 "feature",其中将 { 10 } 识别为简单闭包会覆盖其可能识别为函数构建器的使用。这可能只是一个编译器问题,或者更糟的是它可能是一个语言定义问题...

请前往 feedbackassistant.apple.com 并提交报告。

接受的答案是正确的,它只是传递值而忽略构建器。

但是it's a bug, not a feature.

已在 Swift 5.3 上修复,仅在 Xcode 12(目前处于测试阶段)上可用。