【问题标题】:When to use generics in Swift [duplicate]何时在 Swift 中使用泛型 [重复]
【发布时间】:2017-11-16 10:44:52
【问题描述】:

我研究过泛型,但我仍然不明白,为什么要使用它们,什么时候可以使用协议?

例如,检查以下函数:

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
        }

所以,我的问题是,在什么情况下我应该使用泛型?我有成像的所有情况都可以通过协议轻松处理。

【问题讨论】:

标签: ios swift


【解决方案1】:

如果您提供的情况是正确的。它不一定通过使其通用来添加任何东西。

但是举个例子,你有一些协议MyProtocol,你想创建一个函数,接受其中的两个并返回第三个。但该功能仅在 firstsecond 属于同一类型时才有效...

func combine(first: MyProtocol, second: MyProtocol) -> MyProtocol {
    // do some combining here.
}

现在它的定义不太明确,因为 firstsecond 在这里可以是不同的类型。唯一需要的是它们符合协议。以及返回类型是什么?

现在考虑...

function combine<T: MyProtocol>(first: T, second: T) -> T {
    // do some combining here
}

现在函数是通用的,但增加的是 firstsecond 仍然必须符合协议。但现在它们必须是同一类型。并且该函数将返回与firstsecond 相同类型的另一个项目。

在这种情况下,您肯定会受益于使用泛型而不仅仅是协议。

【讨论】:

  • 感谢详细回答,但我认为,我们可以通过传递两个 Any 对象来处理这种情况,提供保护语句来检查它们是否是相同的对象,并且返回类型也将是 Any。是的,那会很丑陋,但功能仍然可以工作:)
  • @EvgeniyKleban 但是编译器会推断出第一个函数的返回类型是什么? TBH,我什至不确定编写函数的第一种方式是否会编译,因为您将协议用作类型。假设您传入两个Strings,并且该函数检查它们是否都是同一类型...然后该函数返回什么?它可以返回IntFloatUIView,只要它们符合MyProtocol。所以编译器没有办法对其进行类型检查。
  • 是的,我只是在操场上检查过
  • 那么,我们只需要在我们想要返回一个对象类型或者我们想要确保传递相同类型的对象时才需要使用泛型吗?
  • @EvgeniyKleban 你问为什么要使用泛型?或者,当他们为您的问题提供答案时,您是否正在寻找不同意的人?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2022-01-09
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多