1.泛型

泛型是一种非常灵活的语法,允许程序在函数、枚举、结构体、类中定义类型形参,这种类型形参实际代表的类型是动态改变的——程序可以等到真正使用这些函数、枚举、结构体、类时才为这些类型形参传入实际的类型。

2.泛型函数

就是在声明函数时定义一个或多个类型占位符。语法格式如下:
func 函数名<T, S> (形参列表) -> 返回值类型

{

//函数体

}

func copyArray <T> (src : [T]) -> [T] {
var arr : [T] = []
for element in src
{
arr.append(element)
}
return arr;
} print(copyArray([1, 2, 3, 4])) //此时T的类型代表Int
//输出 [1, 2, 3, 4]
print(copyArray(["g", "h", "k"])) //此时T的类型代表String
//输出 ["g", "h", "k"]

定义多个类型参数,根据不同的运算返回不同元素类型。

func projection <SrcType, DescType>(src:[SrcType], fn:(SrcType) -> DescType) -> [DescType] {
var result = [DescType]()
for element in src {
result.append(fn(element))
}
return result
} var books = ["AB", "BCDD", "CDE"]
//计算字符串的长度
var fn :(String)->Int = {$0.characters.count}
var proj = projection(books, fn: fn) print(proj)
//输出[2, 4, 3] //字符串拼接
var fn1 :(String)->String = {"《" + $0 + "》"}
var proj1 = projection(books, fn: fn1) print(proj1)
//输出 ["《AB》", "《BCDD》", "《CDE》"]

3.泛型类型

泛型不仅可以在函数中使用,也可以在Swift的类型(枚举、结构体、类)中使用。(Swift内置支持的Array、Dictionary就是典型的泛型结构体)

结构体增加泛型参数

struct Rect<T> {
var x : T
var y : T
var weight : T
var height : T
}
var rect1 : Rect<Int>= Rect.init(x: 1, y: 1, weight: 14, height: 28)
var rect2 : Rect<Double>= Rect.init(x: 1.0, y: 2.0, weight: 14.5, height: 28.2)
print(rect1)
//输出 Rect<Int>(x: 1, y: 1, weight: 14, height: 28)
print(rect2)
//输出 Rect<Double>(x: 1.0, y: 2.0, weight: 14.5, height: 28.2)

枚举增加泛型参数,是它们适应枚举中的关联值

enum Season<T> {
case Winter(temp:T)
case Summer
case Spring
case Autumn
}
var w : Season<Int>= Season.Winter(temp: 0)
var w1 : Season<Double> = Season.Winter(temp: -0.2)

类增加泛型参数

class Apple <T> {
var info : T
init(info : T) {
self.info = info
}
} var a = Apple<String>.init(info: "11")
print(a.info)
//输出 11
var a1 = Apple<Double>.init(info: 1.23)
print(a1.info)
//输出 1.23

Swift—泛型(上)的更多相关文章

  1. Swift泛型协议的N种用法

    They said "you should learn a new language every year," so I  learned Swift. Now  I  learn ...

  2. Swift泛型和泛型函数

    泛型(generic)可以使我们在程序代码中定义一些可变的部分,在运行的时候指定.使用泛型可以最大限度地重用代码.保护类型的安全以及提高性能.在Swift集合类中,已经采用了泛型.一.一个问题的思考怎 ...

  3. 学习Swift -- 泛型

    泛型 泛型代码可以让你写出根据自我需求定义.适用于任何类型的,灵活且可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码的意图. 泛型所解决的问题 先来看一个交换两个int ...

  4. Swift 泛型參数

    原文:http://www.cocoachina.com/newbie/basic/2014/0612/8802.html 本页内容包含:泛型形參语句和泛型实參语句 本节涉及泛型类型.泛型函数以及泛型 ...

  5. 系统整理 精讲 swift 泛型

    泛型是一种非常领会的语法,让我很是膜拜! 真是让人又爱又恨,学不懂的时候很抓狂 允许程序在函数,枚举,结构体,类中定义类型形参(类型可以动态改变) 每次使用可以传入不同类型的形参! Array< ...

  6. Java中的泛型 (上) - 基本概念和原理

    本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...

  7. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  8. Swift泛型Protocol对比C#泛型Interface

    本篇纯属抬杠之作,之前我们提到了Swift的泛型Protocol使用associatedtype关键字,而不是使用<Type>语法的泛型参数.这其中有什么好处呢? 我就这个问题搜索了一些回 ...

  9. swift文件上传及表单提交

    var carData:NSMutableDictionary = NSMutableDictionary(); var request:NSMutableURLRequest = NSMutable ...

随机推荐

  1. HttpServletRequest常用的方法

    假设客户端请求的地址:http://localhost:8082/TestReq/MyServlet/?username=李雷&age=20 request.getRequestURL htt ...

  2. linux命令每日一练习 解压命令

    .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...

  3. 第三篇bootstrap 网格基础

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 网格系统类似一个表格,有行和列,它必须放置在一个类型设置为c ...

  4. AliOS编译安装MyRocks

    MyRocks是facabook版将自主研发的MySQL分支,其源码位于为:https://github.com/facebook/mysql-5.6/ 首先需要安装以下: sudo yum inst ...

  5. ubuntu的一些操作

    1.修改ubuntu的grub启动选择菜单 需要修改到文件为 /boot/grub/grub.cfg 命令: sudo gedit /boot/grub/grub.cfg 修改默认启动项:set de ...

  6. centos上libreoffice+unoconv安装步骤,实现word转pdf

    一.libreoffice安装 1.yum search  libreoffice查询一下系统自带的安装包 安装libreoffice.x86_64这个就可以了   2.yum install lib ...

  7. MySQL 通过semi join 优化子查询

    半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...

  8. PAT 1072. Gas Station (30)

    A gas station has to be built at such a location that the minimum distance between the station and a ...

  9. 路线更改事件 $routeChangeStart 与 $locationChangeStart

    $routeChangeStart属于$route模块,使用将要改变的路由和当前路由对比,在没有跳转之前 参数包括 function(event, next, current)  next $loca ...

  10. nodejs渲染模板

    为什么要用nodejs来渲染? 之前前端的任务就是用HTML+CSS 来高保真的还原UI所设计原图,偶尔会使用少量的jq来对页面添加一些特效,页面还要交付给后端开发人员进行数据填充(php jsp)等 ...