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. Android Fragment的使用

    定义 Fragment可以理解成一个迷你型的活动,同样可以包含布局,同样有自己的生命周期.比Activity要轻量级,在程序内部做界面跳转要比Activity快的多. 静态添加 Fragment可以静 ...

  2. JSP内置对象---request 对象

    request.jsp: <%@ page language="java" import="java.util.*" contentType=" ...

  3. json处理总结(前端js和后端java)

    前端(js): json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键,下面将介绍两者之间的相互转换. json字符串:var st ...

  4. C++模拟C#事件委托机制(二)

    原文 来自于http://www.cnblogs.com/netssfy/archive/2010/02/02/1662056.html 为了解决非法地址访问的冲突,首先需要知道发生该错误的原因是什么 ...

  5. Hadoop:输入,输出,key,value格式

    map: (K1, V1) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3) (K1, V1): jobConf.setInputKeyClas ...

  6. 百度地图结合echarts并添加行政区块

    作者:LJaer链接:https://www.zhihu.com/question/49251513/answer/125728764来源:知乎<!DOCTYPE html> <ht ...

  7. SQL Server 内置函数、临时对象、流程控制

    SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...

  8. ubuntu下code::blocks+opengl的使用与配置

    操作系统:Ubuntu 15.04 gcc version 4.9.2 opengl安装 sudo apt-get install build-essential libgl1-mesa-dev li ...

  9. android使用镜像 Android sdk 和源码等

    HTTP Proxy Server:mirrors.neusoft.edu.cn HTTP Proxy Port :80

  10. pip自动生成requirements.txt依赖关系清单

    Python项目中经常会带requirements.txt文件,里面是项目所依赖的包的列表,也就是依赖关系清单,这个清单也可以使用pip命令自动生成. pip命令: 1 pip freeze > ...