Swift—泛型(上)

时间:2022-12-06 12:56:10

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中的泛型 &lpar;上&rpar; - 基本概念和原理

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

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

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

  8. Swift泛型Protocol对比C&num;泛型Interface

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

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

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

随机推荐

  1. 锋利的jQuery-4--阻止事件冒泡和阻止默认行为

    阻止事件冒泡: 如果嵌套元素分别有自己的click事件,当点击内层元素时外层元素的事件也会被触发. $("span").bind("click", functi ...

  2. C&num; Timer执行方法

    private void button3_Click(object sender, EventArgs e) { System.Timers.Timer t = new System.Timers.T ...

  3. &lbrack;Android学习笔记&rsqb;some tips

    集合合并去重: listA.removeAll(listB); listA.addAll(listB); android:singleLine="true"//单行显示 andro ...

  4. &lbrack;python&rsqb; python django web 开发 —— 15分钟送到会用(只能送你到这了)

    1.安装python环境 1.1 安装python包管理器: wget https://bootstrap.pypa.io/get-pip.py sudo python get-pip.py   1. ...

  5. Ruby Enumerator的各种迭代

    Enumerator迭代 Mix-in Enumerator获得的迭代方法: each_cons: each_slice: each_with_index: with_index: each_with ...

  6. markdown首行缩进

    首行缩进两个字符:(每个表示一个空格,连续使用两个即可)   半角的空格  全角的空格

  7. python 面向对象&lpar;二&rpar;成员

    ##################################总结########################### 类的成员: 变量: 实例变量      对象.属性=xxx 类变量    ...

  8. HTTP&period;ContentType

    1. multipart/x-mixed-replace http://blog.dubbelboer.com/2012/01/08/x-mixed-replace.html

  9. android项目中的拍照和本地图片截图

    1,得到保存截图文件的地址 private static final String IMAGE_FILE_LOCATION = Environment.getExternalStorageDirect ...

  10. MyBatis&lpar;3&rpar;开发dao方法

    本次全部学习内容:MyBatisLearning       SqlSession         SqlSession是一个面向用户(程序员)的接口.         SqlSession中提供了很 ...