Swift4.2语言参考(九) 泛型和参数

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

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

泛型子句

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

<generic parameter list>

所述泛型列表是逗号分隔的泛型,其中每一个具有以下形式的列表:

type parameter: constraint

泛型参数由类型参数后跟可选约束组成。甲类型参数是一个简单的占位符类型的名称(例如,TUVKeyValue,等等)。您可以在类型,函数或初始化程序声明的其余部分中访问类型参数(及其任何关联类型),包括函数或初始化程序的签名。

约束指定类型参数从一个特定的类继承或符合一协议或协议的组合物。例如,在下面的泛型函数中,泛型参数指示替换type参数的任何类型参数必须符合协议。T: ComparableTComparable

1 func simpleMax<T: Comparable>(_ x: T, _ y: T) -> T {
2     if x < y {
3         return y
4     }
5     return x
6 }

因为Int并且Double,例如,两者都符合Comparable协议,所以此函数接受任一类型的参数。与泛型类型相比,在使用泛型函数或初始值设定项时,不指定泛型参数子句。相反,类型参数是从传递给函数或初始值设定项的参数类型推断出来的。

1 simpleMax(17, 42) // T is inferred to be Int
2 simpleMax(3.14159, 2.71828) // T is inferred to be Double

where子句

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

where requirements

泛型子句中的要求where指定类型参数继承自类或符合协议或协议组合。尽管generic where子句为表达类型参数的简单约束提供了语法糖(例如,等同于等等),但您可以使用它来为类型参数及其关联类型提供更复杂的约束。例如,您可以约束类型参数的关联类型以符合协议。例如,指定符合协议并且关联类型符合协议。该约束确保序列的每个元素是等同的。

<T: Comparable><T> where T: Comparable<S: Sequence> where S.Iterator.Element: EquatableSSequenceS.Iterator.ElementEquatable

您还可以使用==运算符指定两种类型相同的要求。例如,表达符合协议的约束,并且两个序列的元素必须属于同一类型。

<S1: Sequence, S2: Sequence> where S1.Iterator.Element == S2.Iterator.ElementS1S2Sequence

替换类型参数的任何类型参数必须满足对type参数的所有约束和要求。

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

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

 1 GRAMMAR OF A GENERIC PARAMETER CLAUSE
 2
 3 generic-parameter-clause → < generic-parameter-list >
 4
 5 generic-parameter-list → generic-parameter | generic-parameter , generic-parameter-list
 6
 7 generic-parameter → type-name
 8
 9 generic-parameter → type-name : type-identifier
10
11 generic-parameter → type-name : protocol-composition-type
12
13 generic-where-clause → where requirement-list
14
15 requirement-list → requirement | requirement , requirement-list
16
17 requirement → conformance-requirement | same-type-requirement
18
19 conformance-requirement → type-identifier : type-identifier
20
21 conformance-requirement → type-identifier : protocol-composition-type
22
23 same-type-requirement → type-identifier == type

参数子句

一个一般的参数子句指定泛型类型的类型参数。泛型参数子句包含在尖括号(<>)中,并具有以下形式:

1 <generic argument list>

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

1 struct Dictionary<Key: Hashable, Value>: Collection, ExpressibleByDictionaryLiteral {
2     /* ... */
3 }

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

您还可以使用类型参数替换类型参数,该类型参数本身是泛型类型的专用版本(前提是它满足适当的约束和要求)。例如,可以替换类型参数ElementArray<Element>与阵列的专用版本,Array<Int>以形成一个数组,其元素本身整数数组。

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

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

1 GRAMMAR OF A GENERIC ARGUMENT CLAUSE
2
3 generic-argument-clause → < generic-argument-list >
4
5 generic-argument-list → generic-argument | generic-argument , generic-argument-list
6
7 generic-argument → type

原文地址:https://www.cnblogs.com/strengthen/p/9740719.html

时间: 2024-10-16 17:18:22

Swift4.2语言参考(九) 泛型和参数的相关文章

Swift4.2语言参考(六) 声明

一个声明引入了一个新的名称或构建到你的程序.例如,您使用声明来引入函数和方法,引入变量和常量,以及定义枚举,结构,类和协议类型.您还可以使用声明来扩展现有命名类型的行为,并将符号导入到其他地方声明的程序中. 在Swift中,大多数声明也是定义,因为它们是在声明它们的同时实现或初始化的.也就是说,由于协议不实现其成员,因此大多数协议成员仅是声明.为方便起见,因为在Swift中区别并不重要,术语声明包括声明和定义. 1 GRAMMAR OF A DECLARATION 2 3 declaration

Swift4.2语言参考(八) 模式

模式表示单个值或复合值的结构.例如,元组的结构是两个元素的逗号分隔列表.因为模式表示值的结构而不是任何一个特定值,所以可以将它们与各种值匹配.例如,模式匹配元组和任何其他两元素元组.除了将模式与值匹配之外,您还可以提取部分或全部复合值,并将每个部分绑定到常量或变量名称.(1, 2)(x, y)(1, 2) 在Swift中,有两种基本类型的模式:成功匹配任何类型值的模式,以及可能无法在运行时匹配指定值的模式. 第一种模式用于在简单变量,常量和可选绑定中对值进行解构.这些包括通配符模式,标识符模式以

嵌入式linux C++语言(九)——模板

嵌入式linux C++语言(九)--模板 泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意. 泛型编程的代表作品STL是一种高效.泛型.可交互操作的软件组件.    泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库).其语言支持机制就是模板(Templates).模板的精神其实很简单:参数化类型.换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T. 一.函数模板 1.函数重载实现的泛型 #include

Drools文档(八) 规则语言参考

规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领域.本章主要与本机规则格式一致.用于表示语法的图表被称为"铁路"图表,它们基本上是语言术语的流程图.技术上非常热衷的也可以参考DRL.g这是规则语言的Antlr3语法.如果您使用Rule Workbench,则可以通过内容帮助为您完成许多规则结构,例如,输入"ru"并按

Swift语言指南(九)--基本运算符

运算符(operator)是用来检查,改变或合并值的一种特殊符号或短语.例如,加号运算符让两个数字相加(如:let i = 1 + 2),还有些更复杂的运算符,如逻辑与运算符(&&)(如:if enteredDoorCode && passedRetinaScan)和自增运算符(++i)(将 i 的值加 1 的便捷写法). Swift 支持标准C语言的大多数运算符,并且改进了一些特性以规避常见的代码错误.赋值运算符(=)是没有返回值的,这样是为了避免在使用等于运算符(==)

嵌入式 Linux C语言(九)——C语言的安全问题和指针陷阱

嵌入式 Linux C语言(九)--C语言的安全问题和指针陷阱 C语言是灵活度和自由度较大的编程语言,作为C语言核心的指针更是让C语言程序员可以越过安全的栅栏,对某些内存区域进行破坏性访问,引发安全风险.很多安全问题都能追根溯源到指针的误用.本文将从指针的角度解读C语言常见的安全问题和指针陷阱. 一.指针的声明和初始化 1.不恰当的指针声明 int* ptr1, ptr2;//声明ptr1为int指针,ptr2为整型 int *ptr1, *ptr2;//ptr1,ptr2都声明为指针 #def

PHP-Manual的学习----【语言参考】

2017年6月28日11:29:31 语言参考    基本语法    类型    变量    常量1.当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码.此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略. 2.如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记.这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP

(转载)虚幻引擎3--UnrealScript语言参考

档概要: UnrealScript 介绍和简要参考.最初作者是Tim Sweeney (EpicGames) 内容 UnrealScript语言参考 介绍 快速链接 本文档的目的 UnrealScript的设计目标 虚幻引擎3中UnrealScript的新功能 代码结构示例 Unreal虚拟机 对象层次 类 变量 变量类型 内置类型 集合数据类型 Unreal类型 变量修饰符 可编辑性 数组 Structs 修饰符 枚举 常量 Object和actor引用变量 类引用变量 表达式 赋值 在类之间

Docs-.NET-C#-指南-语言参考-关键字-值类型:可以 null 的值类型

ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:可以 null 的值类型 1.返回顶部 1. Nullable value types (C# reference) 2019/11/04 7 分钟阅读时长 A nullable value type T? represents all values of its underlying value type T and an additional null value. For example, you can assig