玖叶教程网

前端编程开发入门

Swift 4.1 官方文档大全(第三十章)通用参数和参数

本章介绍泛型类型,函数和初始值设定项的参数和参数。 在声明泛型类型,函数,下标或初始值设定项时,可以指定泛型类型,函数或初始值设定项可以使用的类型参数。 当创建泛型类型的实例或调用泛型函数或初始化程序时,这些类型参数充当占位符,它们被实际的具体类型参数替换。

有关Swift中泛型的概述,请参阅泛型。

通用参数条款

通用参数子句指定通用类型或函数的类型参数,以及这些参数的任何关联约束和要求。 通用参数子句包含在尖括号(<>)中,并具有以下形式

  • <generic parameter list>

通用参数列表是以逗号分隔的通用参数列表,每个列表都具有以下形式:

  • type parameter: constraint

通用参数由一个类型参数和一个可选约束组成。 类型参数只是占位符类型的名称(例如,T,U,V,键,值等)。 您可以在类型,函数或初始化程序声明的其余部分(包括函数或初始化程序的签名)中访问类型参数(及其任何关联类型)。

该约束指定类型参数从特定类继承或符合协议或协议组合。 例如,在下面的通用函数中,通用参数T:Comparable指示替换类型参数T的任何类型参数必须符合Comparable协议。

func simpleMax<T: Comparable>(_x: T, _y: T) -> T {

if x < y {

return y

}

return x

}

因为例如Int和Double都符合Comparable协议,所以这个函数接受任何一种类型的参数。 与泛型类型相比,当您使用泛型函数或初始化程序时,您不指定泛型参数子句。 类型参数是从传递给函数或初始值设定项的参数类型推断出来的。

simpleMax(17, 42) // T is inferred to be Int

simpleMax(3.14159, 2.71828) // T is inferred to be Double

通用条款

您可以通过在类型或函数正文的开始大括号之前包含通用where子句来指定对类型参数及其关联类型的附加要求。 通用where子句由where关键字组成,后跟逗号分隔的一个或多个需求列表。

  • where requirements

泛型where子句中的要求指定类型参数从类继承或符合协议或协议组合。尽管泛型where子句提供了用于表示对类型参数的简单约束的语法糖(例如,<T:Comparable>等同于<T>,其中T:Comparable等),但您可以使用它来提供更复杂的类型约束参数及其相关类型。例如,您可以将关联的类型参数类型约束到协议。例如,<S:Sequence>其中S.Iterator.Element:Equatable指定S符合Sequence协议,并且关联的S.Iterator.Element类型符合Equatable协议。这个约束确保了序列的每个元素是可以等同的。

您还可以使用==运算符来指定两种类型相同的要求。例如,<S1:序列,S2:序列>其中S1.Iterator.Element == S2.Iterator.Element表示S1和S2符合序列协议的约束,并且两个序列的元素必须是相同类型的。

任何替代类型参数的类型参数都必须满足放置在类型参数上的所有约束和要求。

您可以通过在类型参数上提供不同的约束,要求或两者来重载泛型函数或初始化程序。当您调用重载的泛型函数或初始化程序时,编译器会使用这些约束来解析要调用的重载函数或初始化程序。

有关泛型where子句以及在泛型函数声明中查看示例的更多信息,请参阅Generic Where子句

GRAMMAR OF A GENERIC PARAMETER CLAUSE

generic-parameter-clause → <-generic-parameter-list->-

generic-parameter-list → generic-parameter-generic-parameter-,-generic-parameter-list-

generic-parameter → type-name-

generic-parameter → type-name-:-type-identifier-

generic-parameter → type-name-:-protocol-composition-type-

generic-where-clause → where-requirement-list-

requirement-list → requirement-requirement-,-requirement-list-

require ment → conformance-requirement-same-type-requirement-

conformance-requirement → type-identifier-:-type-identifier-

conformance-requirement → type-identifier-:-protocol-composition-type-

same-type-requirement → type-identifier-==-type-

通用参数条款

泛型参数子句指定泛型类型的类型参数。 尖括号(<>)中包含一个泛型参数子句,其格式如下:

  • <generic argument list>

泛型参数列表是一个逗号分隔的类型参数列表。 类型参数是一个实际的具体类型的名称,用于替换泛型类型的泛型参数子句中的相应类型参数。 结果是该泛型类型的专用版本。 下面的例子显示了Swift标准库的通用字典类型的简化版本。

struct Dictionary<Key: Hashable, Value>: Collection, ExpressibleByDictionaryLiteral {

/* ... */

}

通用字典类型Dictionary <String,Int>的专用版本是通过将泛型参数Key:Hashable和Value替换为具体类型参数String和Int来形成的。 每个类型参数必须满足它所替换的通用参数的所有约束,包括通用where子句中指定的任何附加要求。 在上面的例子中,Key类型参数被约束为符合Hashable协议,因此String也必须符合Hashable协议。

你也可以用一个类型参数替换一个类型参数,该类型参数本身就是泛型类型的专用版本(只要它满足适当的约束和要求)。 例如,您可以将Array <Element>中的类型参数Element替换为数组的一个特定版本Array <Int>,以形成其元素本身是整数数组的数组。

let arrayOfArrays: Array<Array<Int>> = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

正如通用参数子句中所述,您不使用泛型参数子句来指定泛型函数或初始化程序的类型参数

generic-argument-clause → <-generic-argument-list->-

generic-argument-list → generic-argument-generic-argument-,-generic-argument-list-

generic-argument → type

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言