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

时间:2014-10-10 18:01:40

标签: generics types swift compiler-errors closures

考虑这种通用方法(只有类型很重要,而不是它的作用):

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,我怎样才能编译第二个案例?

1 个答案:

答案 0 :(得分:0)

如果你明确地使闭包的返回类型:

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

有趣的是,只有在通用值未在其他任何地方定义时才会发生。因此,数组的排序闭包没有这个问题:

[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

它可能是编译器错误,也可能是在可能出现模糊的情况下强迫事物更明确的方法。