为抽象类型聚合编写扩展函数

Swift本身是一种静态类型的语言

对于静态类型的语言,编译器在编译时必须具有有关类和函数的所有信息。 这意味着所有变量,常量和函数必须事先声明其类型。 但是,具有可以作用于不同类型的一种功能或一种方法仍然是可能的。 为此, Swift提供了强大的功能Generic

通用代码启用可以与不同类型一起使用的功能和类型

通常,功能通常是一段可重用的代码,用于执行单个相关的动作。 因此,函数的普通形式如下:

 func function_name(parameters: declared_type) -> return_type { //... Code here return typed_constants } 

传统上,我们可以为相同目的单独创建函数以与不同类型一起使用。 但是,这意味着我们为每个唯一的类型声明基于相似的模式生成代码。 而且它以某种方式违反了以一种干净的方式进行编码并且免维护,这始终是程序员的目标和原则。 有鉴于此,我们需要一种抽象的方式,并能够以清晰的形式表达其意图。 这就是我们所谓的Generic

让我们从可以以不同类型重用的通用实体开始

通用实体必须具有类型参数。 下面的“ T ”代表通用实体最终将使用的任何类型。

 struct GenericStruct { var someThing: T } // After above manner, GenericStruct can be constructed and parameterized over different types by adding type parameters in a pair of angle-brackets. let a = GenericStruct(someThing: 1) let b = GenericStruct(someThing: 2.5) let c = GenericStruct(someThing: "Hello, world!") 

然后,如果我们将通用实体放入集合中怎么办?

看起来定义通用实体是容易和直接的。 但是,故事不会总是那么简单。 如果我们确实希望将通用实体放入集合类型(如Set ,则需要更多装饰,并为此目的采用Hashable协议。 下面的代码段是修订版本。

 struct GenericStruct: Hashable { var someThing: T var hashValue: Int { get { // Hashable in angle-brackets is a constraint to tell compiler that type T must have .hashValue return someThing.hashValue } } static func ==(lhs: GenericStruct, rhs: GenericStruct) -> Bool { return lhs.hashValue == rhs.hashValue } } let set: Set = [ GenericStruct(someThing: "Watermelon"), GenericStruct(someThing: "Orange"), GenericStruct(someThing: "Banana") ] 

扩展功能是不可错过的最后一件事

回到我们的主题,目的是为抽象类型聚合编写扩展功能。 毫无疑问,故事还没有结束。 最后一项具有扩展功能的内容仍然缺失。 我们需要对代码段进行第三次修订才能使扩展功能与GenericStruct

 extension Set { func getFirstWith(value: T) -> Element? { return filter({$0.hashValue == value.hashValue}).first } } let set: Set = [ GenericStruct(someThing: "Watermelon"), GenericStruct(someThing: "Orange"), GenericStruct(someThing: "Banana") ] let output = set.getFirstWith(value: "Orange") print(output!) 

当然,其他类型如Int也可以。 干杯!

 let set: Set = [ GenericStruct(someThing: 226), GenericStruct(someThing: 603), GenericStruct(someThing: 818) ] let output = set.getFirstWith(value: 818) print(output!)