首页 > 解决方案 > 只有一个值时,函数生成器不起作用?

问题描述

我有一个函数构建器

@_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
}

但不工作:(

任何想法?

标签: swiftswift5.1

解决方案


任何想法?

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

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

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


推荐阅读