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 喵神博客 接 ...
随机推荐
- Servlet------>jsp自定义标签5(标签体内容改为大写)
5.把标签体内容改为大写(tld中的配置我就省略了,详细请看jsp自定义标签1) import java.io.IOException; import javax.servlet.jsp.JspExc ...
- Jenkins 持续集成配置
Jenkins搭建.NET自动编译测试与发布环境 Jenkins之Deploy部署(包括站点和类库项目) * 续篇--TFS+MSbuild+jenkins 实现 持续集成+自动部署到WEB网站 Je ...
- jmeter常见参数 vars、prev、ctx 、props 类的api
ctx - ( JMeterContext) - gives access to the context vars - ( JMeterVariables) - gives read/write ac ...
- python常见模块之os模块
os模块是python系统与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前 ...
- 7.Git工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 1.工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的test文件夹就是一个工作区 ...
- ED3 flash 、OBP flash
海力士.东芝等ED3 NAND Flash ED3的TLC编程规则相对于OBP来讲会简单许多,因为ED3的编程规则非常有规律,很容易掌握,ED3的每个WL页数量是固定的. ED3在对行地址的定义上与O ...
- C的指针疑惑:C和指针17(经典抽象数据类型)
堆栈这种数据最鲜明的特点是:后进先出. 用动态数组实现堆栈: #include "C17.h" #include <stdio.h> #include <stdl ...
- TraClus java版实现
前一阵子我们部门接到了业务那边的一个需求.想通过用户的wifi数据计算出商场内用户最喜爱走的线路.其实说白了就是用户轨迹聚类.根据业务的需求,我们最终采用了traClus聚类算法.tra ...
- 使用js在网页上显示时间
<html> <script> function getDate(){ var d,s,t; d = new Date(); s = d.getFullYear().toStr ...
- docker——三大核心概念
镜像.容器.仓库是docker的三大核心概念. docker镜像类似于虚拟机镜像,你可以将其理解为一个只读模板. docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用.容器是从 ...