generics - 添加显式返回到闭包会导致编译器错误: 编译器 Bug?

  显示原文与译文双语对照的内容
0 0

请考虑这里泛型方法( 。只有类型是重要的,而不是它所做的):

func flatMap<SourceType, TargetType>(source: [SourceType], transform: SourceType [TargetType]) -> [TargetType] {
 return []
}

对方法的调用将很好地编译:

let seq = flatMap(["some","string"], { s in [1, 2] })

但是,仅添加显式返回到关闭案例会产生错误:

let seq = flatMap(["some","string"], { s in return [1, 2] })//ERROR: Cannot convert the expression's type.. . to type 'StringLiteralConvertible'

编译器仍然可以按照它在第一种情况下的方式来推断类型,对? 区别在于( 我看不到任何)? 如果我需要 return,我如何使第二个案例编译?

时间:原作者:

0 0

如果使闭包的返回类型显式,则它将有效:

let seq = flatMap(["some","string"], { s -> [Int] in return [1, 2] })

有趣的是,只有在其他地方没有定义通用值时,才会发生。 因此,array的排序关闭不存在这里问题:

[1,2,3].sorted{a,b in return a <b}//works

如果由于某些原因,将一个参数添加到具有TargetType的函数中,则它也有效:

func flatMap<SourceType, TargetType>(source: [SourceType],aTarget:TargetType, transform: SourceType -> [TargetType]) -> [TargetType] {
 return []
}
let seq = flatMap(["some","string"], 1, {s in return [1, 2]})//works

它既不是编译器 Bug,也是一种强制在可能模棱两可的情况下更加明确的方法。

原作者:
...