Swift中的通用可选处理

有时,您希望编写一种适用于任何Optional类型的通用算法,无论包装在里面的是哪种实际类型。 好的,这可以使用免费的泛型函数轻松完成,但是例如,如果要编写Sequence扩展以删除所有nil值怎么办?

由于Optional不是协议而是具体类型,因此事情变得有点复杂,因此不能将其用作通用类型约束。

Swift中的通用协议和具体类型具有不同的用途:我们创建实例并声明具体类型的变量,而协议则可以用作通用类型约束。

类型擦除是一种在我们要声明一个能够容纳符合特定协议的任何具体类型的变量时使用的技术。 相反,我们想要的是同一难题的另一部分,我们需要一个协议,允许我们将具体的泛型用作约束。

用英语听起来这听起来很复杂,但通常情况下,用普通的Swift编写起来看起来要简单得多。

因此,这里我们只定义一个OptionalType协议,声明WrappedType关联的类型,并使Optional枚举符合该类型。 请注意,泛型类型参数不会自动满足协议要求,但是这里我们有类型推断。

为了使该协议有用,我们公开了一些基本的Optional功能:

  • asOptional属性使我们可以访问可选的绑定语法。
  • ExpressibleByNilLiteral一致性允许我们使用nil进行初始化。

完成之后,我们现在可以将OptionalType用作一般约束:

如果您正在寻找可以使用Optional枚举完成的更多技巧,则应查看Russ Bishop撰写的精彩文章。