数组、集合和泛型
- 格式:pdf
- 大小:1.96 MB
- 文档页数:36
C#中的泛型和泛型集合⼀、什么是泛型?泛型是C#语⾔和公共语⾔运⾏库(CLR)中的⼀个新功能,它将类型参数的概念引⼊.NET Framework。
类型参数使得设计某些类和⽅法成为可能,例如,通过使⽤泛型类型参数T,可以⼤⼤简化类型之间的强制转换或装箱操作的过程(下⼀篇将说明如何解决装箱、拆箱问题)。
说⽩了,泛型就是通过参数化类型来实现在同⼀份代码上操作多种数据类型,利⽤“参数化类型”将类型抽象化,从⽽实现灵活的复⽤。
使⽤泛型给代码带来的5点好处:1、可以做⼤限度的重⽤代码、保护类型的安全以及提⾼性能。
2、可以创建集合类。
3、可以创建⾃⼰的泛型接⼝、泛型⽅法、泛型类、泛型事件和泛型委托。
4、可以对泛型类进⾏约束,以访问特定数据类型的⽅法。
5、关于泛型数据类型中使⽤的类型的信息,可在运⾏时通过反射获取。
例⼦:using System;namespace ConsoleApp{class Program{class Test<T>{public T obj;public Test(T obj){this.obj = obj;}}static void Main(string[] args){int obj1 = 2;var test = new Test<int>(obj1);Console.WriteLine("int:" + test.obj);string obj2 = "hello world";var test1 = new Test<string>(obj2);Console.WriteLine("String:" + test1.obj);Console.ReadKey();}}} 输出结果是: int:2 String:hello world 分析: 1、 Test是⼀个泛型类。
C语言集合的实现C语言是一种通用的程序设计语言,提供了丰富的数据结构和算法库。
在C语言中,集合是一种存储不重复元素的数据结构,常用于需要存储、查询和操作一组不同元素的场景。
本文将介绍C语言中集合的实现方式,并详细解释其原理和应用。
1.集合的定义集合是一种不包含重复元素的容器,没有特定的顺序。
在C语言中,可以使用数组或链表等数据结构来实现集合。
集合通常有以下几个基本操作:插入元素、删除元素、判断元素是否存在、求并集、求交集、求差集等。
2.集合的实现方式2.1使用数组实现集合使用数组实现集合比较简单,只需要定义一个固定大小的数组,然后使用元素的值作为下标来标记元素是否存在。
例如,要存储范围在0-9之间的整数集合,可以定义一个大小为10的数组,数组下标代表元素值,数组元素的值用于表示元素是否存在。
下面是使用数组实现集合的示例代码:```c#define SIZE 10//初始化集合void initSet(int set[])for (int i = 0; i < SIZE; i++)set[i] = 0;}//插入元素void insertElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 1;}//删除元素void deleteElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 0;}//判断元素是否存在int isElementExist(int set[], int element) if (element >= 0 && element < SIZE)return set[element];} elsereturn 0;}//打印集合void printSet(int set[])for (int i = 0; i < SIZE; i++) if (set[i] == 1)printf("%d ", i);}}int maiint set[SIZE];initSet(set);insertElement(set, 1); insertElement(set, 3); insertElement(set, 5); deleteElement(set, 3);printf("集合中的元素为:"); printSet(set);return 0;```这段代码中,先定义了一个大小为10的数组作为集合的存储空间。
1.集合框架√2.泛型√3.异常√1.掌握常用的集合类(接口)2.充分理解什么是泛型3.掌握java中的异常■一个问题?前面我们学习了数组,充分体会到数组的优越性,就是可以存储同一类型的数据,但是我们假设有这样的需求,大家看看如何解决?请做一个公司职员薪水管理系统,要求完成如下功能:①当有新员工时,将该员工加入到管理系统①可以根据员工号,显示该员工的信息.②可以显示所有员工信息③可以修改员工的薪水⑤当员工离职时,将该员工从管理系统中删除⑥可以按照薪水从低到高顺序排序【思考题】⑦可以统计员工的平均工资和最低和最高工资.■问题分析当然,我们可以使用数组来解决,可是用数组的话,有什么问题,我们来看看:■解决之道-链表或是集合类我们想,如果有这样一种数组,它可以动态的改变就好了,java的设计者为我们提供了一系列的集合类,我们来看看.■解决之道-链表或是集合类我们想,如果有这样一种数组,它可以动态的改变就好了,java的设计者为我们提供了一系列的集合类,我们来看看.■解决之道-链表或是集合类■使用从上面的图可以看出java集合类主要有以下几种: List结构的集合类ArrayList类, LinkedList类, Vector类,Stack类Map结构的集合类HashMap类,Hashtable类Set结构的集合类HashSet类,TreeSet类Queue结构的集合Queue接口■使用我们给大家举几个案例来看看集合类的常用方法:【Demo6_1.java】和【Demo7_3.java】■具体应用在我们熟悉了一些集合类的基本用法后,我们来解决前面提出的公司职员薪水管理系统。
首先我们使用ArrayList这个集合类.案例【Demo7_2.java】■ArrayList和Vector的区别ArrayList与Vector都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是他们也有区别:一.同步性:Vector是同步的。
数组和集合实例using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication2{class Program{static void Main(string[] args){int[] arr1 = new int[2] {1,2};int[,] arr2 = new int[2, 3] {{0,1,2 },{2,3,4 }};Console.WriteLine(arr2[1,1]);ArrayListArrayList alt = new ArrayList();alt.Add("123");alt.Add(123);alt.Add(true);bool iscontain = alt.Contains("1");alt.Clear();/*alt.Insert(0, "abc")*/;Console.WriteLine(iscontain);for(int i = 0; i < alt.Count; i++){Console.WriteLine(alt[i].ToString() + " " + alt[i].GetType().ToString());}foreach (var x in alt){Console.WriteLine(x.ToString() + " " + x.GetType().ToString());}泛型集合 ListList<string> str_list = new List<string>();str_list.Add("a");str_list.Add("b");str_list.Add("c");str_list.Add("d");foreach(string x in str_list){Console.WriteLine(x);}哈希表hashtableHashtable ht = new Hashtable();ht.Add("1","a");ht.Add(2, "b");ht.Add(3, false);ht.Add("x", 3.14);Console.WriteLine(ht[2]);foreach(var x in ht.Keys){Console.WriteLine(ht[x]);}字典表 DictionaryDictionary<string, int> dic = new Dictionary<string, int>();dic.Add("a", 3);dic.Add("b", 4);dic.Add("c", 5);dic.Add("d", 6);dic.Add("e", 7);foreach(var x in dic.Keys){Console.WriteLine(x);}队列 queueQueue que = new Queue();que.Enqueue("张三");que.Enqueue("李四");que.Enqueue("王五");que.Enqueue("赵六");Console.WriteLine("现在的长度是" + que.Count);Console.WriteLine(que.Dequeue());Console.WriteLine("现在的长度是" + que.Count);堆栈 stackStack st = new Stack();st.Push("a");st.Push("b");st.Push("c");st.Push("d");Console.WriteLine(st.Count);Console.WriteLine(st.Pop());Console.WriteLine(st.Count);Console.ReadLine();int[] arr1 = new int[2] { 1, 2 };int[,] arr2 = new int[2, 3]{{0,1,2},{2,3,4}};Console.WriteLine(arr2[1, 1]);ArrayList 特点不需要不需要限长度,不需要规定类型,缺点:键值只能是0,1,2,3往后排:ArrayList alt = new ArrayList();alt.Add("123");alt.Add(123);alt.Add(true);alt.Remove(123); 从其中移除 clear 是全部清空的意思bool iscontain=alt.Contains("123"); 看看⾥⾯是否包含"123",如果有就会显⽰"true",如果没有就会显⽰false; alt.Clear(); 全部清除:alt.Insert(0,"abc"); 意思是往 0 位置插⼊⼀个字符串"123";Console.WriteLine(alt);for (int i = 0; i < alt.Count;i++ ) {Console.WriteLine(alt[i].ToString()+" "+alt[i].GetType().ToString());}var类型是万能类型foreach(var x in alt){Console.WriteLine(x.ToString()+" "+alt[i].GetType().ToString)}泛型集合 list 需要规定类型,不需要规定长度也不⾏规定键值也是从0,1,2,3开始排List<string> str_list = new List<string>();str_list.Add("a");str_list.Add("b");str_list.Add("c");str_list.Add("d");foreach (string x in str_list) {Console.WriteLine(x);}哈希表hashtable 不错在顺序的概念Hashtable ht = new Hashtable();ht.Add("1", "a");ht.Add(2, "b");ht.Add(3, false);ht.Add("x", 3.14);//Console.WriteLine(ht[2]);foreach (var x in ht.Values) {Console.WriteLine(x);}foreach (var x in ht.Keys){Console.WriteLine(x); //取全部的值Console.WriteLine(ht[x]);}字典表 DictionaryDictionary<string, int> dic = new Dictionary<string, int>();dic.Add("a", 3);dic.Add("b", 4); 前⾯的是key键后⾯的是value值dic.Add("c", 5);dic.Add("d", 6);dic.Add("e", 7);dic.Add("f", 8);foreach (var x in dic.Keys) {Console.WriteLine(x);}队列 queue 先进先出Queue que = new Queue();que.Enqueue("张三");que.Enqueue("李四");que.Enqueue("王五");que.Enqueue("赵六");Console.WriteLine("现在的长度是" + que.Count);Console.WriteLine(que.Dequeue()); //dequeue()函数⽤于移除每个匹配元素的指定队列中的第⼀个函数,并执⾏被移除的函数。
待办事项java 课程设计一、课程目标知识目标:1. 学生能理解Java中待办事项应用的基本概念,掌握使用类和对象来表示待办事项。
2. 学生能够运用集合框架管理一组待办事项,了解数组列表和泛型集合的使用场景。
3. 学生能够掌握基本的异常处理,保证程序的稳定运行。
技能目标:1. 学生能够独立编写和调试Java程序,实现待办事项的增加、删除、查询和修改功能。
2. 学生通过本课程学习,能够掌握基本的编程规范,编写出结构清晰、易于维护的代码。
3. 学生能够运用所学知识,结合实际问题,设计出合理的算法和数据结构解决待办事项的管理问题。
情感态度价值观目标:1. 培养学生积极思考、主动探究的学习态度,增强解决问题的自信心。
2. 通过团队协作,培养学生的沟通能力和团队精神,理解合作的重要性。
3. 培养学生关注生活、发现生活中的问题,并尝试用编程解决问题的意识。
本课程针对高年级学生,结合Java学科特点,注重理论与实践相结合,培养学生的编程能力和实际应用能力。
课程目标旨在使学生能够掌握Java编程的基本知识,提高解决问题的技能,同时培养良好的情感态度价值观,为后续学习打下坚实基础。
二、教学内容1. 类与对象:介绍待办事项的概念,学习如何用Java类表示待办事项,包括属性(如标题、描述、截止日期)和方法(如完成状态切换)。
2. 集合框架:学习Java集合框架,特别是ArrayList和泛型集合List,用于存储和管理一组待办事项。
3. 异常处理:介绍异常处理的基本概念,学习如何处理运行时异常,保证程序在遇到错误时能够给出合适的反馈。
4. 编程规范:回顾和强化Java编程规范,包括命名规范、代码组织、注释使用等,提高代码的可读性和可维护性。
5. 算法与数据结构:设计简单算法实现待办事项的增加、删除、查询和修改功能,讨论不同数据结构对待办事项管理效率的影响。
教学内容安排和进度:- 第一课时:介绍待办事项概念,学习类与对象的基本知识,创建一个简单的待办事项类。
以下是一些ArkTS 的基本类型示例:
1. 基本数值类型:
整数(int):用于表示整数。
浮点数(float):用于表示带有小数的数值。
数字(number):用于表示整数或浮点数。
2. 布尔类型:
布尔(boolean):用于表示真(true)或假(false)。
3. 字符串类型:
字符串(string):用于表示文本。
4. 数组类型:
数组(array):用于表示一组值的集合。
5. 元组类型:
元组(tuple):用于表示固定数量和类型的元素集合。
6. 枚举类型:
枚举(enum):用于表示一组命名的常量。
7. 任何类型:
任何(any):用于表示不特定类型的值。
8. 未知类型:
未知(unknown):用于表示可能是任何类型的值,但在初始化后必须进行类型检查。
9. null 和undefined:
null:表示空值。
undefined:表示未定义或未初始化的值。
10. 对象和类:
对象(object):用于表示非数组的数据结构。
类(class):用于表示具有属性和方法的复合类型。
11. 接口和类型别名:
接口(interface):用于定义对象或函数的形状。
类型别名(type alias):用于为现有类型创建一个新名称。
12. 泛型:
泛型(generics):用于创建可重用、类型安全的组件。
除了上述类型,ArkTS 还提供了许多其他类型和工具,以便开发者能够更方便地构建复杂的应用程序。
这些功能包括但不限于反射、动态类型、异步编程等。
数组和集合的区别总结⼀、数组声明了它容纳的元素的类型,⽽集合不声明。
⼆、数组是静态的,⼀个数组实例具有固定的⼤⼩,⼀旦创建了就⽆法改变容量了。
⽽集合是可以动态扩展容量,可以根据需要动态改变⼤⼩,集合提供更多的成员⽅法,能满⾜更多的需求。
三、数组不论是效率还是类型检查都是最好的。
1.数组是⼤⼩固定的,⼀旦创建⽆法扩容;集合⼤⼩不固定,2.数组的存放的类型只能是⼀种,集合存放的类型可以不是⼀种(不加泛型时添加的类型是Object);3.数组是java语⾔中内置的数据类型,是线性排列的,执⾏效率或者类型检查(不懂),都是最快的.ArrayList就是基于数组创建的容器类.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45数组Array和集合的区别:(1)数组是⼤⼩固定的,并且同⼀个数组只能存放类型⼀样的数据(基本类型/引⽤类型)(2)JAVA集合可以存储和操作数⽬不固定的⼀组数据。
(3)若程序时不知道究竟需要多少对象,需要在空间不⾜时⾃动扩增容量,则需要使⽤容器类库,array不适⽤。
联系:使⽤相应的toArray()和Arrays.asList()⽅法可以回想转换。
⼀.集合的体系结构:List、Set、Map是这个集合体系中最主要的三个接⼝。
List和Set继承⾃Collection接⼝。
Map也属于集合系统,但和Collection接⼝不同。
Set不允许元素重复。
HashSet和TreeSet是两个主要的实现类。
Set 只能通过游标来取值,并且值是不能重复的。
List有序且允许元素重复。
ArrayList、LinkedList和Vector是三个主要的实现类。
ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的LinkedList 是线程不安全的,底层是由链表实现的Map 是键值对集合。
Java练习题一、基本语法1. 编写一个Java程序,输出“Hello, World!”。
2. 声明一个整型变量并赋值为10,然后输出该变量的值。
3. 编写一个Java程序,实现两个整数的加、减、乘、除运算。
4. 声明一个浮点型变量并赋值为3.14,然后输出该变量的值。
5. 编写一个Java程序,判断一个整数是奇数还是偶数。
6. 使用三元运算符计算两个整数中的较大值。
7. 编写一个Java程序,实现字符串的拼接。
8. 声明一个布尔型变量并赋值为true,然后输出该变量的值。
9. 编写一个Java程序,输出1到100的所有偶数。
10. 使用for循环输出九九乘法表。
二、数组与字符串1. 声明一个整型数组并初始化,然后输出数组中的所有元素。
2. 编写一个Java程序,实现数组的逆序输出。
3. 计算一个整型数组的平均值。
4. 编写一个Java程序,查找数组中的最大值和最小值。
5. 使用冒泡排序算法对整型数组进行排序。
6. 编写一个Java程序,实现字符串的反转。
7. 判断一个字符串是否为回文。
8. 输出一个字符串中字母和数字的个数。
9. 编写一个Java程序,实现字符串的截取。
10. 使用StringBuilder类拼接一个由100个“Java”组成的字符串。
三、面向对象1. 定义一个学生类(Student),包含姓名、年龄和成绩属性,并实现一个打印学生信息的方法。
2. 编写一个Java程序,创建一个学生对象并设置其属性,然后调用打印学生信息的方法。
3. 定义一个矩形类(Rectangle),包含长和宽属性,并实现计算面积和周长的方法。
4. 编写一个Java程序,创建两个矩形对象,并比较它们的面积大小。
5. 定义一个动物类(Animal),包含吃、睡和叫的方法,然后创建一个狗类(Dog)继承动物类,并重写叫的方法。
6. 编写一个Java程序,演示多态性,创建一个动物数组,包含狗和猫对象,并调用它们的叫方法。
C#总结NET的魅⼒⾯向对象四⼤优点复⽤性扩展性维护性灵活性强⼤的Web⽀持⽀持云计算.NET框架结构.NET公共语⾔运⾏时(CLR)CTS:语法和数据类型各不相同CLS:成为公共语⾔规范框架类库(FCL)是⼀个综合性的⾯向对象的可重要类型集合类和对类和对象本质上的区别,类定义了⼀组概念的模型,⽽对象是真实的实体类是概念对象是实体关系由对象归纳为类,是归纳对象共性的过程在类的基础上,将状态和⾏为实体化对象的过程称之为实例化封装——⾯向对象三⼤特征之⼀封装⼜称为信息隐藏:是指利⽤抽象数据类型讲数据的操作结合在⼀起,使其构成⼀个不可分割的独⽴实体隐藏内部的细节保留对外的接⼝封装带来的好处保证数据的安全性提供清晰的对外接⼝类内部实现可以任意修改,不影响其他类类是最基本的封装总结1,是⼀个⾯向⽹络,⽀持各种⽤户终端的开发平台2,.NET框架的主要内容是CLR,FCL,,XML,,WinForm和Web Servic等3,CLR是所有.NET应⽤程序运⾏时的环境,是所有.NET应⽤程序都要使⽤的编程基础4,FCL是⼀个宝藏,常⽤的命名空间下的类库需要我们在学习中掌握和灵活运⽤5,MSDN⽂档提供了.NET框架类库的详细技术说明,善⽤MSDN可以提⾼我们分析和解决问题的能⼒6,类图是表⽰结构及类与类之间的关系图表值类型和引⽤类型值类型源于System.ValueType命名空间,每个值类型的对象都有⼀个独⽴的内存区域⽤于保存⾃⼰的值,值类型所在的内存区域称之为“栈”(stack)。
不同的变量会分配不同的存储空间,存储空间中存储的是该变量的值改变⼀个变量值不会影响该到另⼀个变量值引⽤类型引⽤类型源于System.Object命名空间中引⽤数据类型,赋值是把对象的引⽤传递给另⼀个引⽤两个引⽤指向同⼀块内存空间对于引⽤类型,赋值是把原对象的引⽤传递给另⼀个引⽤,对数组⽽⾔,当⼀个数组引⽤赋值给另⼀个数组引⽤后,这两个引⽤指向同⼀个数组,也就是指向同⼀块储存空间结构语法访问修饰符 struct 结构名{//结构体}结构的特点值类型具有较快数据提取速度结构中可以有字段,也可以有⽅法定义结构时,结构中的字段不能给初始值结构可以不new,但是⽆属性,要给所有的属性赋值才能调⽤⽅法装箱和拆箱将值类型转换为引⽤类型称之为装箱反之为拆箱在实际开发中,应该尽量减少不必要的装箱和拆箱,因为⼆者的储存⽅式不同,转换时性能损失较⼤。
C# 术语⼤全 引导语:C#是微软公司发布的⼀种⾯向对象的、运⾏于.NET Framework之上的⾼级程序设计语⾔。
以下是店铺整理的C# 术语⼤全,欢迎参考阅读! 访问修饰符 ⽤于限制对类型或类型成员的访问的关键字,如private、protected、internal或public。
可访问成员 ⼀种可由给定类型访问的成员。
⼀种类型的可访问成员不⼀定可由另⼀种类型访问。
访问器 设置或检索与属性关联的私有数据成员的值的⽅法。
读写属性具有 get 和 set 访问器。
只读属性只有 get 访问器。
匿名⽅法 匿名⽅法是作为参数传递给委托的代码块。
基类 ⼀种由其他“派⽣”类继承的类。
调⽤堆栈 运⾏时从程序的'开始位置到当前正在执⾏的语句的⼀系列⽅法调⽤。
类 ⼀种描述对象的数据类型。
类不仅包含数据,还包含作⽤于数据的⽅法。
构造函数 类或结构中⽤于初始化该类型的对象的⼀种特殊⽅法。
委托 委托是⼀种引⽤⽅法的类型。
⼀旦为委托分配了⽅法,委托将与该⽅法具有完全相同的⾏为。
派⽣类 ⼀种使⽤继承获取、扩展或修改其他“基”类的⾏为和数据的类。
析构函数 类或结构中⽤于准备要由系统销毁的实例的⼀种特殊⽅法。
事件 类或结构的⼀个成员,⽤于发送更改通知。
字段 类或结构的⼀个可直接访问的数据成员。
泛型 使⽤泛型,可以定义使⽤类型参数定义的类和/或⽅法。
当客户端代码实例化类型时,会指定⼀个特定的类型作为参数。
IDE 集成开发环境。
为各种开发⼯具(包括编译器、调试器、代码编辑器和设计器)提供统⼀⽤户界⾯的应⽤程序。
不可变类型 ⼀种类型,其实例数据(字段和属性)在创建后不会更改。
⼤多数值类型都属于不可变类型。
不可访问的成员 ⽆法由给定类型访问的成员。
⼀种类型的不可访问的成员并不⼀定对另⼀种类型是不可访问的。
继承 C# ⽀持继承,因此从其他类(也称为基类)派⽣的类将继承相同的⽅法和属性。
继承涉及基类和派⽣类。
Swift中的泛型Swift泛型介绍泛型是为Swift编程灵活性的⼀种语法,在函数、枚举、结构体、类中都得到充分的应⽤,它的引⼊可以起到占位符的作⽤,当类型暂时不确定的,只有等到调⽤函数时才能确定具体类型的时候可以引⼊泛型。
我们之前实际上已经使⽤过泛型,例如:Swift的Array和Dictionary类型都是泛型集。
你可以创建⼀个Int数组,也可创建⼀个String数组,或者甚⾄于可以是任何其他Swift的类型数据数组。
同样的,你也可以创建存储任何指定类型的字典(Dictionary),⽽且这些类型可以是没有限制的。
我们为什么要使⽤泛型呢?下⾯有个例⼦可以简单说明使⽤泛型的好处// 定义⼀个函数,要求追加数组数据到指定⼀个数组中func appendIntToArray(src:[Int],inout dest:[Int]) {// 遍历并加到数组后边for element in src {dest.append(element)}}// 使⽤appendIntToArray添加整形数组数据var arr = [2,5]appendIntToArray([12,9], dest: &arr)print(arr) // [2,5,12,9]// 那么再要求让你实现添加字符串呢,好吧重写⼀个func appendStringToArray(src:[String],inout dest:[String]) {for element in src {dest.append(element)}}var strArr = ["OC","Swift"]appendStringToArray(["PHP", "C#"], dest: &strArr)print(strArr)// 如果有需要你实现添加其他类型呢?// 是不是每个类型都需要写⼀个对应的函数去实现,那这样就太复杂了!这时候我们就需要使⽤泛型// 定义泛型函数,在普通函数名后⾯加上<T>,T是个类型占⽤符,可以表⽰任何类型func appendArray<T>(src:[T],inout dest:[T]) {for element in src {dest.append(element)}}// 看到如此强⼤了吧?然后随意使⽤var arr2 = [5,8]appendArray([9,58], dest: &arr2) // appendArray⾃动识别要添加的数组数据类型print(arr2) // [5, 8, 9, 58]var strArr2 = ["renhairui","hello"]appendArray(["nihao", "helloworld"], dest: &strArr2)print(strArr2) // ["renhairui", "hello", "nihao", "helloworld"]var doubleArr = [1.2,3.4]appendArray([6.5,1.0], dest: &doubleArr)print(doubleArr) // [1.2, 3.4, 6.5, 1.0]我的理解:泛型就是先占坑,具体占坑做什么,随你Swift泛型使⽤Swift泛型相关使⽤可分为以下⼏点:泛型函数泛型类型泛型约束泛型协议泛型函数,函数参数或返回值类型⽤泛型表⽰// 泛型函数定义式func 函数名<泛型1,泛型2,…>(形参列表)->返回值类型{// 函数体...}泛型函数使⽤实例// 定义⼀个泛型函数,把2个参数的值进⾏交换func swapTwoValues<T>(inout valueOne:T ,inout valueTwo:T) {let temporaryA = valueOnevalueOne = valueTwovalueTwo = temporaryA}var oneInt = 3var twoInt = 107swapTwoValues(&oneInt, valueTwo: &twoInt)print("oneInt = \(oneInt), twoInt = \(twoInt)") // oneInt = 107, twoInt = 3var oneStr = "Hello"var twoStr = "World"swapTwoValues(&oneStr, valueTwo: &twoStr)print("oneStr = \(oneStr), twoStr = \(twoStr)") // oneStr = world, twoStr = hello泛型类型,在定义类型时使⽤泛型使⽤也和泛型函数差不多,就是在类型名后⾯加上<泛型1,泛型2,…>,然后在类型⾥⾯直接使⽤泛型即可通常在泛型函数中,Swift 允许你定义你⾃⼰的泛型类型。