泛型是一种非常领会的语法,让我很是膜拜!

真是让人又爱又恨,学不懂的时候很抓狂

允许程序在函数,枚举,结构体,类中定义类型形参(类型可以动态改变)

每次使用可以传入不同类型的形参!

Array<T>   T就是泛型,代表数组元素的类型

struct Dictionary《Key:Hashable,Value》 key value是泛型语法

Array<String>限定了元素类型 位String的数组

为什么要用?会带来哪些方便?请看下面例子

要求:前一个数组追加到后一个数组中

func copyIntArray(src:[Int],inout dest:[Int])

{

// 遍历 并加到数组后边

for element in src{

dest.append(element)

}

}

使用

var arr = [2,5]

copyIntArray([12,9],&arr)

println(arr) // [2,5,12,9]

那么再要求让你实现添加字符串呢,好吧重写一个

func copyStringArray(src:[String],inout dest:[String])

{

for element in src{

dest.append(element)

}

}

使用

var  strArr = ["oc","swift"]

copyStringArray(["php",&strArr])

大家发现了吧,除了类型以外,其他代码都一样的,为什么重复造轮子?合二为一吧。假如还有Double类型呢?

泛型派上用场了

泛型函数:指定一个或多个类型占位符,类型暂时不确定,等具体调用的时候再确定

func copyArray<T>(src:[T],inout dest:[T])

{

for element in src

{
dest.append(element)
}

}

看到如此强大了吧?

然后随意使用

var arr = [5,8]

copyArray([9,58],&arr)

var strArr = ["renhairui","hello"]

copyArray(["nihao",&strArr])

var doubleArr = [1.2,3.4]

copyArray([6.5,1.0],&doubleArr)

T是类型占位符,可以当成普通类型使用

通过泛型,让函数具有更好的适应性

下边来深入一下:定义多个类型参数

要求:投影运算, 数组类型不确定,怎么投影不确定,返回值类型不确定

先定义两个类型参数

SrcType 代表需要执行投影数组的元素类型

DscType 得到的元素类型

func projection<SrcType,DescType>(src:[SrcType],fn:(SrcType)->DescType)->[DescType]

{

var result = [DescType]

for element in src

{

// 使用fn函数对数组元素进行投影运算,将运算结果添加到result数组中

result.append(fn(element))

}

}

使用

var books = ["任海瑞","iOS","engineer"]

使用尾随闭包

var proj1 = projection(books){
countElements($0) //计算元素长度
}

println(proj1) // [3,3,8]

假如

var proj2 = projection(books){
"<"+$0+">"

}

println(proj2) //["<任海瑞>","<iOS>","<engineer>"]

再如

books = ["PHP","iOS","swift"]

var proj3 = projection(books){
(b:String)->(String,String) in

return (b,"任海瑞")

}

println(proj3) //["PHP,任海瑞","iOS,任海瑞","swift,任海瑞"]

另外也可以改变 books 的类型,任意类型。

定义泛型类型

struct Rect<T>

{
var x:T

var y:T

var width:T

var height:T

// 计算属性

var position:(T,T)

{
return (self.x,self.y)
}
}

使用

let rect = Rect<Double>(x:1.2,y3.4,width:8.5,height:7.8)

let (x,y) = rect.position

println("\(x),\(y)")

let rect2 = Rect<Int>(x:3,y:6,width:10,height:30)

let(x,y) = rect.postion

class Apple<T>

{
var info:T

init(info:T)

{

self.info = info

}
}

使用

var a1= Apple<String>(info:"苹果")

println(a1.info)

var a2 = Apple<Double>(info:5.6)

从泛型类派生出子类

class A:Apple<T>

{ }

未完善如下:

要求泛型类的子类也带泛型声明

扩展泛型类型

类型约束

关联类型

扩展以后类型来确定关联类型

转载于:https://www.cnblogs.com/heri/p/4472924.html

系统整理 精讲 swift 泛型相关推荐

  1. 千万级常规saas系统架构精讲(干货)

    什么是saas系统 saas这个概念来源于云计算领域,其本质是软件即服务.要理解这个概念需要从历史说起,对于早期的软件行业,一般是A公司需要一套进销存系统则软件公司就会针对A的需求开发一套进销存系统, ...

  2. OpenStack八大核心组件精讲之---swift

    OpenStack八大核心组件精讲之---swift 一.swift简介 二.Swift架构 三.Swift重要组件 一.swift简介 Swift是openstack默认的存储服务,但是在生产环境中 ...

  3. Web安全从入门到放弃之皮卡丘靶场精讲视频教程百度云下载链接(20201213整理)

    Web安全从入门到放弃之皮卡丘靶场精讲视频教程(20201213整理) 如失效,请联系:hk007.cn 课程内容介绍:含全套视频课程内容及对应皮卡丘靶场源文件 百度云盘链接:https://pan. ...

  4. 学习 React 17 系统精讲 结合TS打造旅游电商平台

    React 17 系统精讲 结合TS打造旅游电商平台 2-2 [环境搭建]开始我们的第一个React项目 2-3 [项目启动]使用create-react-app快速搭建React 2-5 [Type ...

  5. YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)

    写在前面:大家好!我是[AI 菌],算法工程师一枚,2021年博客之星Top12,公众号[AI 修炼之路]作者.专注于计算机视觉.深度学习.图像处理技术,热衷于分享AI.CV.DL.ML.OpenCV ...

  6. 农信社计算机类 百度云,2020农信社(农商行)考试资料课件系统精讲班专业综合知识百度云网盘链接分享及试题精讲...

    [练习题] 2020农信社(农商行)考试资料课件系统精讲班下载:[☚☚打开进入即可下载] 提取码:n1mc 1.下列塑料制品中,能够作为食物容器放入微波炉中加热的是( ). A.聚氯乙烯(PVC) B ...

  7. 水稻微生物组时间序列分析精讲1-模式图与主坐标轴分析

    写在前面 上周五我们分享了3月底发表的的 <水稻微生物组时间序列分析>的文章,大家对其中图绘制过程比较感兴趣.一上午收到了超30条留言,累计收到41个小伙伴的留言求精讲. 我们也争取花时间 ...

  8. 剑指Offer名企面试官精讲典型编程题pdf

    下载地址:网盘下载 <剑指Offer:名企面试官精讲典型编程题(第2版)>剖析了80个典型的编程面试题,系统整理基础知识.代码质量.解题思路.优化效率和综合能力这5个面试要点.<剑指 ...

  9. java求sin函数咋写_5类“隐含条件”,题干不写但是你要会用(解三角形知识整合,建议收藏)| 真题精讲-16...

    有的题目本身蕴含了一些*不言自明.无需特别指明*的条件,对于「解三角形」这个板块而言,这种隐藏条件一共有五条. # 先发个福利:我为你准备了全国各个省份5年高考数学真题的精排版讲义:< 121套 ...

  10. 【信息资源管理】单选多选,精讲

    [信息资源管理]单选多选,精讲 J1 J2 J3 J4 随堂考 作业 J5 随堂考 J6 随堂考 作业 J7 J8 J9 J1 1.支配人类社会发展的三大基本要素是(D)A. 资源.人力.资本 B. ...

最新文章

  1. Spring Boot + Vue.js 实现前后端分离(附源码)
  2. matlab中(1 )什么意思,matlab中area(1)什么意?mat – 手机爱问
  3. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
  4. 查看、关闭被占用的端口
  5. Github+docsify打造在线文档网站
  6. zstd安装_PHP: 安装 - Manual
  7. 云图说|初识云数据库GaussDB(for Cassandra)
  8. 【酷熊科技】工作积累 ----------- 内存优化之GC.MarkDependencies
  9. Android小应用-----画画板
  10. python是什么专业学的-自动化专业学习python需要到什么程度?
  11. 设计模式(一)面向对象设计原则
  12. 第10章 评价分类结果 学习笔记下
  13. python 实现一个属于自己的语音播报器
  14. 宝塔面板+小鸟云服务器安全设置
  15. android studio 圆形头像,Android Studio实现带边框的圆形头像
  16. Unity引擎与Cocos引擎的区别
  17. Java实现交叉表_Sql交叉表简单实现 | 学步园
  18. 【现代简约风格装修案例】诠释不一样的简单 !
  19. 有密码的PDF文件如何编辑?
  20. 2022-2028全球3D透视导航技术行业调研及趋势分析报告

热门文章

  1. Flask 下载中文名文件
  2. Stroustrup专访:畅想C++17
  3. Ubuntu java 环境变量
  4. HDOJ_ACM_统计问题
  5. C#操作Win7/Win8的库、收藏夹
  6. head 查看文件前n行
  7. 互评成绩 c语言,1077 互评成绩计算 (C语言)
  8. ipynb pycharm 运行_Mask RCNN代码之demo.ipynb运行与理解
  9. git 小乌龟 配置_Git-TortoiseGit完整配置流程
  10. 一句话菜刀 php eval,如何基于菜刀PHP一句话实现单个文件批量上传?