【问题标题】:Function Builder not working when only one value?只有一个值时,函数生成器不起作用?
【发布时间】:2020-02-13 00:43:07
【问题描述】:

我有一个函数构建器

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

但不工作:(

有什么想法吗?

【问题讨论】:

  • 有趣的问题,我试图让它工作,但我也失败了:) 事实上,你可以将buildBlock 的实现更改为一行:numbers.reduce(0, { $0 + $1 * 2 })

标签: swift swift5.1


【解决方案1】:

有什么想法吗?

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-29
      • 2017-11-23
      • 2021-04-23
      • 2023-01-03
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      相关资源
      最近更新 更多