From 99453d1d4e9d9fe3074eb5ab95200a1b27a89ee5 Mon Sep 17 00:00:00 2001 From: Zhou Fang Date: Thu, 9 Jul 2020 20:52:48 +0800 Subject: [PATCH] GenericParametersAndArguments (#1084) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 增加新段落的翻译 * Update 09_Generic_Parameters_and_Arguments.md Co-authored-by: wamaker Co-authored-by: Jie Liang --- .../09_Generic_Parameters_and_Arguments.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/03_language_reference/09_Generic_Parameters_and_Arguments.md b/source/03_language_reference/09_Generic_Parameters_and_Arguments.md index dae8a71f..604cb7b4 100755 --- a/source/03_language_reference/09_Generic_Parameters_and_Arguments.md +++ b/source/03_language_reference/09_Generic_Parameters_and_Arguments.md @@ -49,6 +49,18 @@ simpleMax(3.14159, 2.71828) // T 被推断为 Double 类型 当然,替代类型形参的类型实参必须满足所有的约束和要求。 +`where` 子句可以存在于包含类型参数的声明中,或作为声明的一部分,被嵌套另一个在含有类型参数的声明中。被嵌套的 `where` 子句依然可以指向包围它的声明中的类型参数,此时 `where` 子句需要满足的条件仅用于它被声明的地方。 + +如果外层的声明也有一个 `where` 子句,两个子句的条件都需要满足。下面的例子中,`startsWithZero()` 只有在 `Element` 同时满足 `SomeProtocol` 和 `Numeric` 才有效。 + +```swift +extension Collection where Element: SomeProtocol { + func startsWithZero() -> Bool where Element: Numeric { + return first == .zero + } +} +``` + 泛型函数或构造器可以重载,但在泛型形参子句中的类型形参必须有不同的约束或要求,抑或二者皆不同。当调用重载的泛型函数或构造器时,编译器会根据这些约束来决定调用哪个重载函数或构造器。 更多关于泛型 where 从句的信息和关于泛型函数声明的例子,可以看一看 [泛型 where 子句](../02_language_guide/22_Generics.md#where-clauses)。