本节波及泛型类型、泛型函数以及泛型结构器的参数,包含形参和实参。申明泛型类型、函数或结构器时,须指定相应的类型参数。类型参数相当于一个占位符,当实例化泛型类型、调用泛型函数或泛型结构器时,就用具体的类型实参代替之。
对于 Swift 语言的泛型概述,见泛型(第二局部第22章)。
泛型形参语句
泛型形参语句指定泛型类型或函数的类型形参,以及这些参数的关联束缚和要求。泛型形参语句用尖括号(<>)包住,并且有以下两种模式:
1. <generic parameter list> <generic parameter list where requirements > 1. <generic parameter list> <generic parameter list where requirements >
泛型形参列表中泛型形参用逗号离开,每一个采纳以下模式:
1. type parameter : constrain
泛型形参由两局部组成:类型形参及其后的可选束缚。类型形参只是占位符类型(如T,U,V,KeyType,ValueType等)的名字而已。你能够在泛型类型、函数的其余部分或者结构器申明,以及函数或结构器的签名中应用它。
束缚用于指明该类型形参继承自某个类或者恪守某个协定或协定的一部分。例如,在上面的泛型中,泛型形参T: Comparable示意任何用于代替类型形参T的类型实参必须满足Comparable协定。
1. func simpleMin<T: COmparable>(x: T, y: T) -> T {2. if x < y {3. return y4. }5. return x6. }
如,Int和Double均满足Comparable协定,该函数承受任何一种类型。与泛型类型相同,调用泛型函数或结构器时不须要指定泛型实参语句。类型实参由传递给函数或结构器的实参推断而出。
1. simpleMin(17, 42)2. // T is inferred to be Int3. simpleMin(3.14159, 2.71828)4. // T is inferred to be Double
材料收录处
Where语句
要想对类型形参及其关联类型指定额定要求,能够在泛型形参列表之后增加where语句。where语句由关键字where及其后的用逗号宰割的多个要求组成。
where语句中的要求用于指明该类型形参继承自某个类或恪守某个协定或协定的一部分。只管where语句有助于表白类型形参上的简略束缚(如T: Comparable等同于T where T: Comparable,等等),然而仍然能够用来对类型形参及其关联束缚提供更简单的束缚。如,<T where T: C, T: P>示意泛型类型T继承自类C且恪守协定P。
如上所述,能够强制束缚类型形参的关联类型恪守某个协定。<T: Generator where T.Element: Equatable>示意T恪守Generator协定,而且T的关联类型T.Element恪守Eauatable协定(T有关联类型是因为Generator申明了Element,而T恪守Generator协定)。
也能够用操作符==来指定两个类型等效的要求。例如,有这样一个束缚:T和U恪守Generator协定,同时要求它们的关联类型等同,能够这样来表白:<T: Generator, U: Generator where T.Element == U.Element>。
当然,代替类型形参的类型实参必须满足所有类型形参所要求的束缚和要求。
泛型函数或结构器能够重载,但在泛型形参语句中的类型形参必须有不同的束缚或要求,抑或二者皆不同。当调用重载的泛型函数或结构器时,编译器会用这些束缚来决定调用哪个重载函数或结构器。
泛型类能够生成一个子类,然而这个子类也必须是泛型类。
泛型参数子句的语法。
参数子句→<Generic-PARAMETER-LISTREQUIRECTION-子句>。
Generic-PARAMETER-LIST→通用参数通用参数列表,通用参数列表。
泛型参数→类型名称。
泛型参数→类型名称:类型标识符。
泛型参数协定类型名称:→组成类型。
Requirements-子句→WHERE?Requirements-List?
Requirements-List→Requirements-Requirements,Requirements-List。
Requirements→Conformance-Requirements-Same-Type-Requirements。
一致性-要求→类型-标识符:类型-标识符。
一致性-要求协定类型-标识符:→-组合-类型。
雷同类型要求→类型标识符==类型标识符
泛型实参语句
泛型实参语句指定泛型类型的类型实参。泛型实参语句用尖括号(<>)包住,模式如下:
1. < generic argument list >
泛型实参列表中类型实参有逗号离开。类型实参是理论具体类型的名字,用来代替泛型类型的泛型形参语句中的相应的类型形参。从而失去泛型类型的一个特化版本。如,Swift规范库的泛型字典类型定义如下:
1. struct Dictionary<KeyTypel: Hashable, ValueType>: Collection, DictionaryLiteralConvertible { /* .. */ }
泛型Dictionary类型的特化版本,Dictionary<String, Int>就是用具体的String和Int类型代替泛型类型KeyType: Hashable和ValueType产生的。每一个类型实参必须满足它所代替的泛型形参的所有束缚,包含任何where语句所指定的额定的要求。下面的例子中,类型形参KeyType要求满足Hashable协定,因而String也必须满足Hashable协定。
能够用自身就是泛型类型的特化版本的类型实参代替类型形参(假如已满足适合的束缚和要求)。例如,为了生成一个元素类型是整型数组的数组,能够用数组的特化版本Array代替泛型类型Array的类型形参T来实现。
1. let arrayOfArrays: Array<Array<Int>> = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
如泛型形参语句所述,不能用泛型实参语句来指定泛型函数或结构器的类型实参。
泛型论元从句的语法。
泛型自变量子句列表<-泛型-参数-列表->→。
泛型参数列表→泛型参数泛型参数,泛型参数列表。
泛型参数→类型
材料收录处
因为文章篇幅无限,只能点到即止地介绍以后一些工作成绩和思考,各个 Swift 还有一些新的方向在摸索,如果你对 iOS 底层原理、架构设计、构建零碎、如何面试有趣味理解,你也能够关注我及时获取最新材料以及面试相干材料。如果你有什么意见和倡议欢送给我留言!
写的不好的中央欢送大家指出,心愿大家多留言探讨,让咱们共同进步!
喜爱iOS的小伙伴能够关注我,一起学习交换!!!