Swift开发之泛型实例
一、Swift泛型
泛型能够让开发者编写自定义需求已经任意类型的灵活可用的的函数和类型。能够让我们避免重复的代码。用一种清晰和抽象的方式来表达代码的意图。
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let temporaryA = a
a = b
b = temporaryA
}
从以上代码来看,它们功能代码是相同的,只是类型上不一样,这时我们可以使用泛型,从而避免重复编写代码。
泛型使用了占位类型名(在这里用字母 T 来表示)来代替实际类型名(例如 Int、String 或 Double)。
func swapTwoValues<T>(_ a: inout T, _ b: inout T)
备注:这个函数功能是用来交换两个同样类型的值,但是这个函数用T占位符来代替实际的类型。并没有指定具体的类型,但是传入的a,b必须是同一个类型T。在调用这个函数d的时候才能指定T是哪种具体的类型。还有函数名后面跟的那个<T>是函数定义的一个占位符类型名,并不会查找T的具体类型。使用该函数只要保证传入的两个参数是同一个类型,就不用根据传入参数的类型不同,而写不同的方法。
看泛型在代码用,是如何使用的。
override func viewDidLoad() {
super.viewDidLoad()
//swift泛型
var num1 =
var num2 =
print("交换前数据: \(num1) 和 \(num2)")
swapTwoValue(&num1, &num2)
print("交换后数据: \(num1) 和 \(num2)")
var str1 = "ABC"
var str2 = "abc"
print("交换前数据: \(str1) 和 \(str2)")
swapTwoValue(&str1, &str2)
print("交换后数据: \(str1) 和 \(str2)")
}
func swapTwoValue<T>(_ a : inout T,_ b : inout T) {
let temp = a
a = b
b = temp
}

二、类型约束
泛型约束大致分为以下几种:
(1)继承约束,泛型类型必须是某个类的子类型
(2)协议约束,泛型类型必须遵循某些协议
(3)条件约束,泛型类型必须满足某种条件
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// 这里是泛型函数的函数体部分
}
1、继承约束
//定义一个父类,动物类
class Animal{
//动物都会跑
func run(){
print("Animal run")
}
}
//定义狗类,继承动物类
class Dog: Animal {
override func run(){//重写父类方法
print("Dog run")
}
}
//定义猫类,继承动物类
class Cat: Animal {
override func run(){//重写父类方法
print("Cat run")
}
}
//定义泛型函数,接受一个泛型参数,要求该泛型类型必须继承Animal
func AnimalRunPint<T:Animal>(animal:T){
animal.run() //继承了Animal类的子类都有run方法可以调用
}
AnimalRunPint(animal: Dog())
AnimalRunPint(animal: Cat())

2、协议约束
//定义泛型函数,为泛型添加协议约束,泛型类型必须遵循Equatable协议
func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
var index =
for value in array {
if value == valueToFind {//因为遵循了Equatable协议,所以可以进行相等比较
return index
} else {
index +=
}
}
return nil
}
//在浮点型数组中进行查找,Double默认遵循了Equatable协议
let doubleIndex = findIndex(array: [3.14159, 0.1, 0.25], valueToFind: 9.3)
if let index = doubleIndex {
print("在浮点型数组中寻找到9.3,寻找索引为\(index)")
} else {
print("在浮点型数组中寻找不到9.3")
}
//在字符串数组中进行查找,String默认遵循了Equatable协议
let stringIndex = findIndex(array: ["Mike", "Malcolm", "Andrea"], valueToFind: "Andrea")
if let index = stringIndex {
print("在字符串数组中寻找到Andrea,寻找索引为\(index)")
} else {
print("在字符串数组中寻找不到Andrea")
}

3、条件约束
//添加泛型条件约束,C1和C2必须遵循Stackable协议,而且C1和C2包含的泛型类型要一致
func pushItemOneToTwo<C1: Stackable, C2: Stackable>( stackOne: inout C1, stackTwo: inout C2)
where C1.ItemType == C2.ItemType
{//因为C1和C2都遵循了Stackable协议,才有ItemType属性可以调用
let item = stackOne.pop()
stackTwo.push(item: item)
}
//定义另外一个结构体类型,同样实现Stackable协议,实际上里面的实现和Stack一样
struct StackOther<T>: Stackable{
var store = [T]()
mutating func push(item:T){//实现协议的push方法要求
store.append(item)
}
mutating func pop() -> T {//实现协议的pop方法要求
return store.removeLast()
}
}
//创建StackOther结构体,泛型类型为String
var stackTwo = StackOther<String>()
stackTwo.push(item: "where")
//虽然stackOne和stackTwo类型不一样,但泛型类型一样,也同样遵循了Stackable协议
pushItemOneToTwo(stackOne: &stackOne, stackTwo: &stackTwo )
print("stackOne = \(stackOne.store), stackTwo = \(stackTwo.store)")
//打印:stackOne = ["hello"], stackTwo = ["where", "swift"]

Swift开发之泛型实例的更多相关文章
- 《Swift开发指南》
<Swift开发指南> 基本信息 作者: 关东升 赵志荣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115366245 上架时间:2014-8-5 出版日期:20 ...
- 《Swift开发指南》国内第一本Swift图书上市了
<Swift开发指南>国内第一本Swift图书上市了 既<courseId=799262">苹果Swift编程语言开发指南>视频教程地址:courseId=79 ...
- Swift开发学习(一):初始篇
http://blog.csdn.net/powerlly/article/details/29351103 Swift开发学习:初始篇 关于 苹果公司于WWDC2014(Apple Worldwid ...
- swift开发多线程篇 - 多线程基础
swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread 使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...
- Swift开发第十篇——可变参数函数&初始化方法顺序
本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...
- Swift开发语法
Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...
- Swift开发常用知识点
#pragma mark - as/类型转换as? / as! 需要根据前面的返回值决定 有?证明可选,可能为空:需要弱解包 没有?证明一定有值:大胆解包 as? 前面的结果是可选的 if let / ...
- Swift 开发语法
文/Tuberose(简书作者)原文链接:http://www.jianshu.com/p/5e2d4c34f18e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 简介 Swift 语 ...
- 高阶函数---swift中的泛型介绍(一步步实现Map函数)
说明 本文内容均出自函数式 Swift一书, 此处整理仅仅是为了自己日后方便查看, 需要深入研究的话, 可以点进去购买, 支持原作者 本书由 王巍–新浪微博大神翻译 OneV's Den 喵神博客 接 ...
随机推荐
- 如何给MFC的菜单项添加快捷键
我们一起分享,如何给MFC的菜单项添加快捷键.[程序在VC6.0编译环境下编译通过.(VS2010的编译环境大同小异)] 1.程序演示环境 1.1新建一个[对话框(Dialog)]的程序.然后,New ...
- 演示一个简单的Redis队列
0.Windows Service版下载 https://github.com/rgl/redis/downloads 1.新建一个Console项目 打开Nuget控制台,执行以下命令 Instal ...
- order meeting room - 离散度30min
w <meta charset="UTF-8"> <?php include('conn.php'); include('w_fun.php'); include ...
- doxygen的简单使用(快速上手)
在网上找了很久一个简单的doxygen教程,这个是最简单的,让你看完之后马上就能写doxygen格式的代码 doxygen是一种从源代码生成文档的工具,支持多种语言.当然,源代码中需按一定的格式写注释 ...
- 你应该知道的vim插件之surround.vim
写代码的时候你会发现这个插件是多么有用! 强烈推荐! 0×01.change 123456 cs"' cs"<q> cs)] cst<p> csw' csW ...
- var 声明变量的变量提升问题(let/const)
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.既全局变量. <scrip ...
- pycharm自定义代码片段
pycharm自定义代码片段 目录 (一)通用阶段 0 .新建.py文件模板:2 0 .pycharm中添加自定义代码片段:一图全知道:3 1 .定义类:classin 描述 ...
- C#建WindowForm调用R可视化
众所周知R软件功能非常强大,可以很好的进行各类统计,并能输出图形.下面介绍一种R语言和C#进行通信的方法,并将R绘图结果显示到WinForm UI界面上的方法,文中介绍的很详细,需要的朋友可以参考下. ...
- python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明
一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...
- python学习笔记(二)文件操作和集合
集合: 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断 2.可以做关系测试, ...