我研究过仿制药但是我仍然没有理解,为什么要使用它们呢?当我们可以使用协议时呢?
例如,检查以下功能:
public static func delete<T>(entity: T, auth: Auth) -> Observable<Void> where T: MSRequestEntity, T: DictConvertable {
// function do something
}
好的,我们有通用实体T,它符合MSRequestEntity和DictConvertable。
但我们可以简单地重写这个:
public static func delete(entity: MSRequestEntity & DictConvertable, auth: Auth) -> Observable<Void> {
// function do something
}
所以,我的问题是,在什么情况下我应该使用泛型?我有成像的所有情况都可以通过协议轻松处理。
答案 0 :(得分:2)
如果您提供的是正确的。它并不一定通过使其成为通用来添加任何东西。
但是举一个你有一些协议MyProtocol
的例子,你想要创建一个带有其中两个并返回第三个的函数。但该功能仅在first
和second
属于同一类型时才有效...
func combine(first: MyProtocol, second: MyProtocol) -> MyProtocol {
// do some combining here.
}
现在定义不太明确,因为此处first
和second
可能属于不同的类型。唯一需要的是它们符合协议。什么是返回类型?
现在考虑......
function combine<T: MyProtocol>(first: T, second: T) -> T {
// do some combining here
}
现在该函数是通用的,但增加的是仍然first
和second
必须符合协议。但现在它们必须属于同一类型。该函数将返回与first
和second
相同类型的其他项目。
在这种情况下,您肯定会从使用泛型而不仅仅是协议中受益。