Swift 面试题
目录

Swift 中什么是泛型 (Generics)?

· 约 5 分钟读完 · 第 119 / 196 章

推荐答案

在 Swift 中,泛型(Generics)是一种允许你编写灵活、可重用的函数和类型的方式。通过使用泛型,你可以编写出能够适用于任何类型的代码,而不需要为每种类型都编写重复的逻辑。泛型代码可以让你避免重复,并以清晰、抽象的方式表达代码的意图。

例如,你可以编写一个泛型函数来交换两个变量的值,而不必为每种类型(如 Int、String 等)都编写一个单独的函数。

在这个例子中,T 是一个占位符类型,表示任何类型。当你调用这个函数时,Swift 会根据传入的参数类型自动推断 T 的具体类型。

本题详细解读

泛型的基本概念

泛型是 Swift 中非常强大的特性之一,它允许你编写可以适用于任何类型的代码。泛型的主要目的是提高代码的复用性和灵活性。通过使用泛型,你可以避免为每种类型编写重复的代码,从而减少代码量并提高代码的可维护性。

泛型函数

泛型函数是使用泛型的最常见方式之一。你可以在函数定义中使用占位符类型(如 T),并在函数体中使用这个类型。当你调用这个函数时,Swift 会根据传入的参数类型自动推断占位符类型的具体类型。

例如,下面的泛型函数 swapTwoValues 可以交换任意类型的两个变量的值:

在这个例子中,T 是一个占位符类型,表示任何类型。当你调用这个函数时,Swift 会根据传入的参数类型自动推断 T 的具体类型。

泛型类型

除了泛型函数,Swift 还允许你定义泛型类型。泛型类型可以是类、结构体或枚举。通过使用泛型类型,你可以创建适用于任何类型的自定义数据结构。

例如,下面的 Stack 结构体是一个泛型类型,它可以存储任何类型的元素:

在这个例子中,Element 是一个占位符类型,表示栈中存储的元素类型。当你创建一个 Stack 实例时,你可以指定 Element 的具体类型。

类型约束

有时你可能希望对泛型类型或函数中的类型进行一些限制。Swift 允许你通过类型约束来指定泛型类型必须符合某些条件。例如,你可以要求泛型类型必须遵循某个协议或继承自某个类。

例如,下面的泛型函数 findIndex 要求泛型类型 T 必须遵循 Equatable 协议:

在这个例子中,T 必须遵循 Equatable 协议,因为函数体中使用了 == 操作符来比较两个值。

关联类型

在协议中,你可以使用关联类型来定义泛型行为。关联类型是协议中的一个占位符类型,它可以在遵循协议的类型中被具体化。

例如,下面的 Container 协议定义了一个关联类型 Item:

遵循 Container 协议的类型需要指定 Item 的具体类型。例如,Stack 结构体可以遵循 Container 协议,并将 Item 指定为 Element:

泛型的优势

泛型的主要优势在于它能够提高代码的复用性和灵活性。通过使用泛型,你可以编写出适用于任何类型的代码,而不需要为每种类型都编写重复的逻辑。这不仅减少了代码量,还提高了代码的可维护性和可读性。

此外,泛型还可以帮助你在编译时捕获类型错误,从而提高代码的安全性。由于泛型代码在编译时会被具体化为特定的类型,因此编译器可以在编译时检查类型是否匹配,从而避免运行时错误。