我有这个函数,它是实际用例的最小化版本:
func f (i:Int) -> <T> (x:T) -> T {
return { x in return x }
}
如您所见,我想基于某些输入计算通用函数。 但正如您在Xcode或swiftstub中看到的那样,此函数会使编译器崩溃。 有人知道Swift是否应该支持这样的定义吗?
答案 0 :(得分:5)
当我在1.2b3上尝试时,它不再崩溃编译器。但是,它不是有效的语法。
如果你想要在调用f
时预先确定类型的函数,可以这样做:
func f<T>(i:Int) -> T -> T {
return { x in return x }
}
// need to tell the compiler what T actually is...
let g = f(1) as Int->Int
g(2) // returns 2
然而,Swift不支持定义“泛型”闭包的能力,即闭包的类型不是在创建闭包时确定的,而是在实际调用闭包时。这将需要更高级别的多态性,这是当前不可用的东西(虽然可能在未来,谁知道 - 将是一个非常好的功能)。目前,占位符需要在呼叫站点完全确定。
答案 1 :(得分:1)
请记住&#34;泛型&#34; Swift泛型的本质是一种误称。通用性只是一种模板符号;所有泛型都是在编译时编译出来的 - 也就是说,代码的一部分中使用的所有泛型都是通过在代码的另一部分中调用它们的方式来解析(指定)的。
但正是由于这个原因,你不能作为函数的结果返回泛型函数,因为在编译时无法解析泛型。
因此,虽然崩溃编译器并不好(Apple想知道它),但是你的代码也不应该编译,并且在这种程度上编译器是正确的。