4

通常一个函数不需要显式类型,因为它可以从上下文推断类型:

let f = { input in
  1 + input
}
f(2)

通常,您需要提供显式类型注释以强制它使用特定类型,或者在编译器无法推断类型的情况下。当您有输入参数时,这很简单:

let f = { (input: Double) -> Double in
  1 + input
}
f(2)

但是,如果您没有输入参数,我不确定语法应该是什么样子:

let f = { -> Double in
  1 + 1
}
f()

错误:预期的表达式

我尝试了所有这些变化都无济于事:

  • let f = { -> Double in:“错误:预期的表达”
  • let f = { _ -> Double in:“错误:无法在当前上下文中推断闭包参数'_'的类型”,这也将其更改为接受一个参数,这不是我想要的。
  • let f = { Void -> Double in:“错误:无法在当前上下文中推断闭包参数'Void'的类型”
  • let f = { Never -> Double in:“错误:无法在当前上下文中推断闭包参数‘从不’的类型”

我可以通过在末尾添加一个as子句来使其工作,但是如果无法使用这种语法为闭包定义一个显式的返回类型,这似乎很冗长并且像是一种疏忽。

let f = {
  1 + 1
} as () -> Double
f()

as如果没有输入参数,如何为闭包定义显式返回类型(使用内联语法而不是)?


注意:如果已经存在另一个问题,我很乐意将其作为重复项关闭。(我尝试使用这些术语搜索重复项explicit type annotation closure return only,但找不到任何相关内容。)

4

1 回答 1

3

空元组()表示一个空参数列表:

let f = { () -> Double in
  1 + 1
}

print(f()) // 2.0

()既可以是类型(与 相同Void)也可以是该类型的实例

let a: Void = ()
let b: () = ()
print(type(of: a) == type(of: b)) // true
于 2020-12-11T20:23:31.407 回答