为什么我不能在带有可变参数、匿名参数的单行 Swift 闭包中使用 .reduce() ?

2024-01-29

第一次关闭有效。但是,一旦我取出虚拟分配,闭包就会停止工作(addUpClosureRedFlagged)。有人知道为什么吗?

let addUpClosureWorking: (Int ...) -> Int = {
  let dummy = "Anything"  // Comment out and wait for the error...
  return $0.reduce(0, combine: +)
}

let addUpClosureRedFlagged: (Int ...) -> Int = {
  return $0.reduce(0, combine: +)   // Should work, but doesn't!
}


addUpClosureWorking(1, 2, 3, 4, 5) // 15

从当前的 Swift (2.1) 开始,当仅包含一行时,闭包的类型推断可能会表现得有点奇怪,请参见例如这个有点相关的问题 https://stackoverflow.com/questions/35184847/inline-if-statement-mutating-inout-parameter-in-a-void-return-closure-weird-err;期望在闭包中显式包含函数类型签名。

这个(编译器)“bug”/闭包限制(至少)对于可变参数以及inout论点:

// variadiac argument example
let fooErr1: (Int ...) -> Int = {
    return $0.reduce(0, combine: +)
} 
// or: let fooErr1: (Int ...) -> Int = { $0.reduce(0, combine: +) }
   /*  error: cannot convert value of type '(_) -> Int' 
              to specified type '(Int...) -> Int'       */

// inout argument example
let fooErr2: (inout _: Int) -> Int = {
    return $0
}
// or: let fooErr2: (inout _: Int) -> Int = { $0 } 
   /* error: cannot convert value of type '_ -> Int' 
             to specified type '(inout Int) -> Int'     */

这可以通过在闭包中显式包含 function:s 类型签名来避免,或者包含anyreturn 语句之前的语句(因此扩展了闭包以包含多行)。

/* Avoiding fooErr1:
   - explicitly state function type signature in closure    */
let foo: (Int ...) -> Int = {
    (bar: Int ...) -> Int in
    return bar.reduce(0, combine: +)
}

/* - include any kind of statment prior to return statement */
let foo2: (Int ...) -> Int = {
    (); return $0.reduce(0, combine: +)
}

/* Avoiding fooErr2:
   - explicitly state function type signature in closure    */
let foo3: (inout _: Int) -> Int = {
    (inout bar: Int) -> Int in 
    return bar
}

/* - include any kind of statment prior to return statement */
let foo4: (inout _: Int) -> Int = {
    (); return $0
}

为什么?我在上面写了“bug”,但也许更多的是编译器对闭包类型推断的当前限制;正如 Pradeep K 在他的回答中所写,这很可能是由于 Swift 编译器的一些复杂性造成的,在这些情况下类型推断失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能在带有可变参数、匿名参数的单行 Swift 闭包中使用 .reduce() ? 的相关文章

随机推荐

  • 在 iPython 中使用 HDF5 文件时出现异常“HDFStore 需要 PyTables”

    我对 Python 非常陌生 正在尝试使用 HDFStore 在 pandas 中创建一个表 如下所示 store HDFStore store h5 我得到例外 Exception Traceback most recent call l
  • 使用 Google Apps 脚本 API 访问其他用户

    我对此真的很困惑 我想使用 Gmail API 使用 google apps 脚本访问和发送另一个帐户中的邮件 我已在高级 Google 服务中启用 Gmail 并在控制台上启用 API 当我使用 me 值时 以下代码有效 但当我为另一个用
  • Jest/Typescript:在 jest 和 Typescript 中包含私有成员的模拟类依赖项

    上下文 我有依赖于类 A 的类 B 我想测试类 B 的方法 该方法在内部调用类 A 的方法 现在 我想通过模拟类 A 对类 B 的方法进行单元测试 Note 1 A 类有一些私有成员 Note 2 A类没有接口 这是我的代码结构 class
  • 错误:无法打开文件“Info.plist”,因为没有该文件

    我已将我的项目从另一台安装了最新 Xcode 的计算机上移走 但现在当我运行项目时它给我错误 Info plist 0 错误 读取数据 文件 Info plist 无法 打开 因为没有这样的文件 以前的项目运行没有问题 但现在在新系统项目上
  • Slick 3.0.0 自动增量复合键

    我有一个表结构如下 Table1 id Int name String version Int 该表相应的 Slick 表示形式为 class Table1 tag Tag extends Table Int String Int tag
  • 在表单之间翻转时如何保留表单的控制值

    需要两种形式才能输入特定交易的所有信息 我希望能够在这两个表单之间来回翻转 保留在每个表单上输入的内容 直到单击 保存 按钮 我想我应该能够使用 Form2 Show Me Hide 然后使用 Form1 Show Me Hide 我第一次
  • Delphi TThread.CurrentThread 和 EAccessViolation - 这是一个错误还是我的无能..?

    在 Delphi 2009 中 我发现每当我在应用程序中使用 TThread CurrentThread 时 应用程序关闭时我都会收到如下错误消息 Exception EAccessViolation in module ntdll dll
  • 努力解析(bash)时间命令

    我正在努力解析 bash 中 time 命令的输出 甚至在我调用它时阻止它打印输出 这是我的测试代码 bin bash TIME time ls lh gt dev null echo Testing echo TIME 目前打印出 bla
  • 列出具有重复项的并集

    我需要在 Python3 中合并两个列表 其中可以存在重复项 并且对于其中一组 结果列表将在两个列表中包含与 max 一样多的列表 一个示例可能会澄清这一点 1 2 2 5 some operator 2 5 5 5 9 1 2 2 5 5
  • 单声道的代码合同?

    单声道支持吗代码合约 http msdn microsoft com en us devlabs dd491992 IE 如果我构建一个类库 单声道用户可以使用我的程序集吗 如果没有 有其他库吗 最好支持静态分析 通过 Visual Stu
  • .NET 4 控制不带 Blend 的默认模板

    当人们无法使用 Expression Blend 时 如何找到 NET 控件的默认模板 到目前为止 当我需要 WPF 控件的模板时 我会访问 Codeplex 上的 WPF 项目页面 浏览源代码 通常会在 Generic xaml 文件中找
  • 升级到ubuntu-16.10后pip无法使用

    与 pip 一起运行命令会出现以下错误 甚至命令 pip V 产生以下错误 我读到该错误是由于 setuptools 版本 31 0 0 造成的 它应该低于 28 0 0 但我的setuptools的版本是26 1 1 它仍然给出同样的错误
  • 对“std::istreambuf_iterator”的使用感到困惑

    以下是来自 cppreference com 的示例 http en cppreference com w cpp iterator istreambuf iterator The Code is include
  • 替换 Intellij 中多个源文件中所有出现的字符串

    是否可以 最好有 2 个选项 1 有变量 2 其他字符串 谢谢 是的 这是可能的 该命令名为 在路径中替换 在我的键盘快捷键首选项中为 Ctrl Shift R 您可以通过键入 Ctrl shift A 并键入 replace 来自己找到它
  • 在 PHP 中,为什么 true 转换为 1 而 false 转换为空字符串?

    布尔 TRUE 值转换为字符串 1 布尔值 FALSE 转换为 空字符串 为什么 FALSE 不转换为 0 如果你先转换为 int 然后转换为字符串 它会打印 0 x false print string int x 打印 0 当然 您可以
  • jQuery 用 div 包裹多个 id

    我试图用 div 包装选定的 id 集 并用不同的 id 包装其他集 但不太确定它应该如何工作 我有以下 html 代码 div class wrapper div div class post div div div div class
  • 同时快速读取/写入 int 数组

    我需要一种快速的方法来同时读取 写入 int 数组 每个索引都需要写入 读取操作仅需要 所有写入完成后完成数组 我从同步版本开始 public final class SynchronizedIntArray private final i
  • 日期之间的 T-SQL 混淆

    我正在 SQL Server 2000 中使用 T SQL 并且有一个表TRANSACTIONS其中有一个日期列TRANDATE定义为 DateTime 以及与此问题无关的许多其他列 该表填充了跨越多年的交易 我遇到了代码 测试 这让我很困
  • 将 X509Certificate2 存储在数据库中

    是否可以将 X509Certificate2 存储在 SQL Server 表中 而不是从文件系统中提取 p12 文件 我相信你可以 但不知道如何去做 这绝对是可能的 X509Certificate2 有一个RawData http msd
  • 为什么我不能在带有可变参数、匿名参数的单行 Swift 闭包中使用 .reduce() ?

    第一次关闭有效 但是 一旦我取出虚拟分配 闭包就会停止工作 addUpClosureRedFlagged 有人知道为什么吗 let addUpClosureWorking Int gt Int let dummy Anything Comm