考虑这种通用方法(只有类型很重要,而不是它的作用):
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] })
有趣的是,只有在通用值未在其他任何地方定义时才会发生。因此,数组的排序闭包没有这个问题:
[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
它可能是编译器错误,也可能是在可能出现模糊的情况下强迫事物更明确的方法。