Swift 中是否允许使用此函数(如果它不会使编译器崩溃)



我得到了这个函数,它是实际用例的最小化版本:

func f (i:Int) -> <T> (x:T) -> T {
    return { x in return x }
}

如您所见,我想根据某些输入计算一个通用函数。但正如你在 Xcode 或 swiftstub 上看到的那样,这个函数会使编译器崩溃。有谁知道 Swift 是否应该支持这样的定义?

当我在 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 不支持定义"泛型"闭包的功能,即闭包的类型不是在创建闭包时确定的,而是在实际调用闭包时确定的。 这将需要更高等级的多态性,这是目前不可用的(尽管也许在未来,谁知道呢 - 将是一个非常好的功能)。 目前,需要在调用站点完全确定占位符。

请记住,Swift 泛型的"泛型"性质有点用词不当。泛型只是一个模板符号;所有泛型都是在编译时编译掉的 - 也就是说,代码的一部分中使用的所有泛型都通过代码的另一部分的调用方式进行解析(指定)。

但正是由于这个原因,你不能返回泛型函数作为函数的结果,因为无法在编译时解析泛型。

因此,虽然编译器崩溃并不好(Apple想知道这一点),但您的代码也不应该编译,并且在某种程度上编译器抵制是正确的。

最新更新