2014-10-10 73 views
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

这看起来像是一个编译器bug。 – dasblinkenlight 2014-10-10 18:15:54

+0

@dasblinkenlight我也会这么说。我想验证它,因为关于Swift类型系统有几个我认为是bug的东西,但是在发布到SO之后,向我解释它们意味着它们是如此甚至是特征。 – drasto 2014-10-10 18:30:19

回答

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 

这是无论是编译器错误还是强迫事情在潜在模糊情况下更明确的方式。