闭包类型推断

2019-12-04 英文原文

如果闭包里只有一个表达式,Swift 会利用闭包的函数体、签名和上下文来进行类型推断。比如下面这段代码里,仅使用 翻倍 的函数体即可将其类型推断为 (Int) -> Int

let 翻倍 = {
  $0 * 2
}

但对于不是单个表达式的闭包,其函数体就不会被用于类型推断。这和 Swift 语言其他部分的类型推断方法是一致的:一次处理一条语句。例如下面这段代码就会报错,因为既无法通过 偶数翻倍 的上下文推断类型,也没有提供闭包的签名:

// error: unable to infer complex closure return type; add explicit type to disambiguate
let 偶数翻倍 = { x in
  if x.isMultiple(of: 2) {
    return x * 2
  } else {
    return x
  }
}

要解决这个问题,我们可以在上下文提供额外的信息:

let 偶数翻倍: (Int) -> Int = { x in
  // ...
}

或者写明闭包的签名:

let 偶数翻倍 = { (x: Int) -> Int in
  // ...
}
许可协议:Apache 2.0 许可+运行时特许

@dynamicCallable 的实现要求

名义类型(nominal type)

comments powered by Disqus