泛型

迅捷泛型

许多人可以理解泛型,阅读泛型代码并遵循代码,但发现使用泛型编写代码或避免使用泛型是很困难的。 让我们可以轻松地考虑适当地使用泛型。

Swift是强类型语言,也是静态类型语言。 当我的意思是强类型时,每个函数参数或返回类型都需要一个类型,并迅速检查传递/返回的值是否属于该类型,否则会发生编译/运行时错误。 当我说静态类型时,我的意思是swift仅检查所有这些编译时间,否则抛出错误。

好吧,如果您想告诉编译器我不确定我将处理的“类型”是什么,并且它可以是动态的? 多数民众赞成在我们排序到动态打字。 但是,使用像Swift这样的强静态类型语言,我们如何实现呢? 那就是泛型出现的地方。

假设您实现了可快速处理“字符串”的STACK,它将类似于以下内容:

现在,说我希望能够实现一个存储整数的堆栈。 最后,我将写另一个与上述完全相同的Stack数据结构,其中函数和返回类型的参数为“ Int”而不是String。

可以这样说,我可以根据需要的数据类型创建动态dataType结构实例。 当然,在实例化时,您必须指定要查找要存储的堆栈的数据类型。 在下面的代码中,其表示为。 注意:T可以是任何东西。 U也可以说G或A或ZZ或GENERIC。

注意:编写任何通用代码的最佳方法是,在我的案例String中编写代码以采用特定的数据类型,然后将其替换为T。在我们的示例中,定义Struct的定义方式为Struct GenericStruct 。 实例化时,请查看其用法。 GenericStruct ()。

任何与泛型

您总是可以说,好吧,我将通过使用下面的Any来解决此特定问题->

那为什么要泛型呢? 好吧,它解决了特定类型的问题。 参见下文。

泛型基本上告诉编译器:“稍后我将为您提供一个类型,我希望您 在指定的任何地方 强制执行该类型 。”

AnyObject基本上告诉编译器:“不用担心这个变量, 无需强制执行任何类型,在这里 我可以做任何想做的事情。”

如果要使用协议,泛型将如何适合那里? 这可能真的很有用。 这是associatedTypes和typealias出现的地方。 请查看以下内容,如何通过类型别名将协议中的项目与动态类型T相关联: