为什么不允许明确地专门化泛型函数?

时间:2016-03-26 05:02:15

标签: swift

在Swift中,应该使用参数类型或返回值来隐式地专门化泛型函数。问题是,当我调用这样的函数时:

func serialize<T>(continuation: GenericWithLongName<T, NSError> -> Void) -> Void 

我不能只写

serialize<SomeType> {
    obj in 
    ...
}

应该是

serialize {
    (obj: GenericWithLongName<SomeType, NSError>) -> Void in
    ...
}

看起来很痛苦。

这个“特征”似乎存在了很长时间。这是一个设计决定吗?允许明确专业化是否有任何负面影响?

有没有什么方法可以使代码更整洁干净而不重构那个泛型类?

1 个答案:

答案 0 :(得分:8)

“特化”函数的一种方法是将泛型类型包含为函数参数:

func serialize<T>(
    t: T.Type, 
    continuation: GenericWithLongName<T, NSError> -> Void ) -> Void { }

现在你可以像这样“专门化”这个功能:

serialize(SomeType.self) { 
    obj in 
    ... 
}

我不知道为什么您要求的功能不可用的答案。我同意你推荐的功能会很有用,但同时这个功能同样适用,而且几乎一样简洁。