fix 3.8 generic parameters and arguments

This commit is contained in:
stanzhai
2014-06-15 00:01:26 +08:00
parent 29aed911e2
commit 2500a7f130

View File

@ -1,6 +1,5 @@
> 翻译fd5788
> 校对yankuangshi
> 翻译fd5788
> 校对yankuangshi, stanzhai
# 泛型参数
---------
@ -19,28 +18,32 @@
泛型形参子句指定泛型类型或函数的类型形参,以及这些参数的关联约束和要求。泛型形参子句用尖括号(<>)包住,并且有以下两种形式:
<generic parameter list>
<generic parameter list where requirements >
> <`generic parameter list`>
> <`generic parameter list` where `requirements`>
泛型形参列表中泛型形参用逗号分开,每一个采用以下形式:
type parameter : constrain
> `type parameter` : `constrain`
泛型形参由两部分组成类型形参及其后的可选约束。类型形参只是占位符类型如TUVKeyTypeValueType等的名字而已。你可以在泛型类型、函数的其余部分或者构造器声明以及函数或构造器的签名中使用它。
约束用于指明该类型形参继承自某个类或者遵守某个协议或协议的一部分。例如,在下面的泛型中,泛型形参`T: Comparable`表示任何用于替代类型形参`T`的类型实参必须满足`Comparable`协议。
func simpleMin<T: COmparable>(x: T, y: T) -> T {
if x < y {
return y
}
return x
```swift
func simpleMin<T: COmparable>(x: T, y: T) -> T {
if x < y {
return y
}
return x
}
```
如,`Int``Double`均满足`Comparable`协议,该函数接受任何一种类型。与泛型类型相反,调用泛型函数或构造器时不需要指定泛型实参子句。类型实参由传递给函数或构造器的实参推断而出。
simpleMin(17, 42) // T is inferred to be Int
simpleMin(3.14159, 2.71828) // T is inferred to be Double
```swift
simpleMin(17, 42) // T is inferred to be Int
simpleMin(3.14159, 2.71828) // T is inferred to be Double
```
## Where 子句
@ -77,19 +80,23 @@
泛型实参子句指定_泛型类型_的类型实参。泛型实参子句用尖括号<>)包住,形式如下:
< generic argument list >
> <`generic argument list`>
泛型实参列表中类型实参有逗号分开。类型实参是实际具体类型的名字用来替代泛型类型的泛型形参子句中的相应的类型形参。从而得到泛型类型的一个特化版本。如Swift标准库的泛型字典类型定义如下
struct Dictionary<KeyTypel: Hashable, ValueType>: Collection, DictionaryLiteralConvertible {
/* .. */
}
```swift
struct Dictionary<KeyTypel: Hashable, ValueType>: Collection, DictionaryLiteralConvertible {
/* .. */
}
```
泛型`Dictionary`类型的特化版本,`Dictionary<String, Int>`就是用具体的`String``Int`类型替代泛型类型`KeyType: Hashable``ValueType`产生的。每一个类型实参必须满足它所替代的泛型形参的所有约束,包括任何`where`子句所指定的额外的要求。上面的例子中,类型形参`KeyType`要求满足`Hashable`协议,因此`String`也必须满足`Hashable`协议。
可以用本身就是泛型类型的特化版本的类型实参替代类型形参(假设已满足合适的约束和要求)。例如,为了生成一个元素类型是整型数组的数组,可以用数组的特化版本`Array<Int>`替代泛型类型`Array<T>`的类型形参`T`来实现。
let arrayOfArrays: Array<Array<Int>> = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```swift
let arrayOfArrays: Array<Array<Int>> = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```
如[泛型形参子句](#generic_parameter)所述,不能用泛型实参子句来指定泛型函数或构造器的类型实参。