系统整理 精讲 swift 泛型
泛型是一种非常领会的语法,让我很是膜拜!
真是让人又爱又恨,学不懂的时候很抓狂
允许程序在函数,枚举,结构体,类中定义类型形参(类型可以动态改变)
每次使用可以传入不同类型的形参!
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 泛型的更多相关文章
- 转 Redis 总结精讲 看一篇成高手系统-4
转 Redis 总结精讲 看一篇成高手系统-4 2018年05月31日 09:00:05 hjm4702192 阅读数:125633 本文围绕以下几点进行阐述 1.为什么使用redis 2.使用r ...
- Java岗 面试考点精讲(基础篇01期)
即将到来金三银四人才招聘的高峰期,渴望跳槽的朋友肯定跟我一样四处找以往的面试题,但又感觉找的又不完整,在这里我将把我所见到的题目做一总结,并尽力将答案术语化.标准化.预祝大家面试顺利. 术语会让你的面 ...
- Keepalived原理与实战精讲--VRRP协议
. 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...
- 微软BI SSIS 2012 ETL 控件与案例精讲课程学习方式与面试准备详解
开篇介绍 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程从2014年9月开始准备,到2014年12月在 天善BI学院 ...
- WKWebView API精讲(OC)
WKWebView API精讲(OC) 前言 鉴于LL同志对笔者说:“能不能写个OC版本的WKWebView的使用教程?”,还积极打赏了30RMB,笔者又怎么好意思拒绝呢,于是才有了下文. 所有看到本 ...
- 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记
VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...
- iOS开发——语法篇OC篇&高级语法精讲二
Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和 ...
- iOS开发——语法篇OC篇&高级语法精讲
高级语法精讲 一.NSSet.NSMutableSet集合的介绍 1)NSSet.NSMutableSet集合,元素是无序的,不能有重复的值. 2)用实例方法创建一个不可变集合对象 例如: //宏定义 ...
- 【C++自我精讲】基础系列四 static
[C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...
随机推荐
- !important定义为最高级不可替代
<!DOCTYPE html> /*!important定义为最高级不可替代*/ <html lang="en"> <head> <met ...
- Assembly.GetManifestResourceNames()获取不到资源文件
Assembly.GetManifestResourceNames()获取到的是嵌入的资源文件 右键资源文件属性 将生成操作改为嵌入的资源就OK咯
- windows、Linux 测试服务器、电脑的某些个端口是否打开
测试远程端口是否开放包括两种方法: 一. 命令行的形式 二.代码 先参考我的博客 windows.Linux 开放端口 一.命令行的形式 两个命令:telnet.nc(netcat) 两种网络层协议: ...
- jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
—.获取dropdownlist的text(ddlList为服务器端dropdownlist的ID,生成name属性等于ddlList的select标签) $("#ddlList optio ...
- Codeforces - 102222C - Caesar Cipher
https://codeforc.es/gym/102222/my 好像在哪里见过这个东西?字符的左右移还是小心,注意在mod26范围内. #include<bits/stdc++.h> ...
- 2018CCPC网络赛A(优先队列,思维)
#include<bits/stdc++.h>using namespace std;priority_queue<pair<int,int>>q;int main ...
- 大融合——LCT维护子树信息
题目 [题目描述] 小强要在 $N$ 个孤立的星球上建立起一套通信系统.这套通信系统就是连接 $N$ 个点的一个树.这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树 ...
- phonegap for andriod之phonegap 环境的搭建
1.环境搭建 1.1安卓的环境搭建 可以参考http://www.cnblogs.com/xuzhiwei/p/3277529.html 1.2PhoneGap下载 我这里下载2.90版本 http: ...
- spark sql metastore 配置 mysql
本文主要介绍如何为 spark sql 的 metastore 配置成 mysql . spark 的版本 2.4.0 版本 hive script 版本为 hive 1.2.2 mysql 为 5. ...
- Unity---MonoBehaviour9大生命周期
1.MonoBehaviour9大生命周期 MonoBehaviour是一个基类,所有Unity脚本都派生自该类. Awake():在脚本实例化时被调用. Start():在Awake之后,Updat ...