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

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

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

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

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>

{ }

未完善如下:

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

扩展泛型类型

类型约束

关联类型

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

系统整理 精讲 swift 泛型的更多相关文章

  1. 转 Redis 总结精讲 看一篇成高手系统-4

    转 Redis 总结精讲 看一篇成高手系统-4 2018年05月31日 09:00:05 hjm4702192 阅读数:125633   本文围绕以下几点进行阐述 1.为什么使用redis 2.使用r ...

  2. Java岗 面试考点精讲(基础篇01期)

    即将到来金三银四人才招聘的高峰期,渴望跳槽的朋友肯定跟我一样四处找以往的面试题,但又感觉找的又不完整,在这里我将把我所见到的题目做一总结,并尽力将答案术语化.标准化.预祝大家面试顺利. 术语会让你的面 ...

  3. Keepalived原理与实战精讲--VRRP协议

    . 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...

  4. 微软BI SSIS 2012 ETL 控件与案例精讲课程学习方式与面试准备详解

    开篇介绍 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程从2014年9月开始准备,到2014年12月在 天善BI学院  ...

  5. WKWebView API精讲(OC)

    WKWebView API精讲(OC) 前言 鉴于LL同志对笔者说:“能不能写个OC版本的WKWebView的使用教程?”,还积极打赏了30RMB,笔者又怎么好意思拒绝呢,于是才有了下文. 所有看到本 ...

  6. 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记

    VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...

  7. iOS开发——语法篇OC篇&高级语法精讲二

    Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和 ...

  8. iOS开发——语法篇OC篇&高级语法精讲

    高级语法精讲 一.NSSet.NSMutableSet集合的介绍 1)NSSet.NSMutableSet集合,元素是无序的,不能有重复的值. 2)用实例方法创建一个不可变集合对象 例如: //宏定义 ...

  9. 【C++自我精讲】基础系列四 static

    [C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...

随机推荐

  1. play 1.2.4的action执行前后的加载逻辑

    ——杂言:最近在整理这一年的笔记,打算慢慢温故一遍,然后搬到博客里头来.这篇是2013.06.18时候整理的关于action执行前后的一些载入先后顺序逻辑.我的理解可能有偏差,如果有错误的,请读者们及 ...

  2. Activity---弹出右侧窗口

    第一步: Activity弹出窗口的布局 <?xml version="1.0" encoding="UTF-8"?> //布局文件main_top ...

  3. Redux API之compose

    compose(...functions) 从右到左来组合多个函数. 这是函数式编程中的方法,为了方便,被放到了 Redux 里. 当需要把多个 store 增强器 依次执行的时候,需要用到它. 参数 ...

  4. [poj1459]Power Network(多源多汇最大流)

    题目大意:一个网络,一共$n$个节点,$m$条边,$np$个发电站,$nc$个用户,$n-np-nc$个调度器,每条边有一个容量,每个发电站有一个最大负载,每一个用户也有一个最大接受量.问最多能供给多 ...

  5. [#413c] Fountains

    http://codeforces.com/contest/799/problem/C 解题关键:树状数组取最大值,注意先搜索,后加入,此种情况可以取出最大值. 为什么可以取到最大值? 1.当分别用两 ...

  6. GET POST区别不同情况

    相信大家在面试的时候经常会被问到:GET与POST有什么区别吧?你是怎么回答的呢?POST比GEt安全?GET有URL的长度限制而POST没有或者很大?GET通过URL或者Cookie传参数,POST ...

  7. 【机器学习】聚类算法——K均值算法(k-means)

    一.聚类 1.基于划分的聚类:k-means.k-medoids(每个类别找一个样本来代表).Clarans 2.基于层次的聚类:(1)自底向上的凝聚方法,比如Agnes (2)自上而下的分裂方法,比 ...

  8. 打开*.gd文件的方法

    问题来了: 你可能会收到*.gd的公文,那么一般的阅读器都打不开…… 解决方法: 使用书生阅读器(三合一版)来打开 地址:http://www.du8.com/download/index.html

  9. C#----接口与多继承

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { ...

  10. [转][译]ASP.NET MVC 4 移动特性

    此教程将讨论ASP.NET MVC 4 Web应用程序里的移动特性.对于此教程,可以使用 Visual Studio Express 2012 或者 Visual Web Developer 2010 ...