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 喵神博客 接 ...
随机推荐
- 新浪博客:html+css+原生JS+Ajax初级+mySql数据库——源码
**************************************************************************************************** ...
- 配置Hibernate的流程
配置项目的前提下你应该配置好你的开发环境 1新建hibernate.cfg.xml文件,放在src目录里 <?xml version="1.0" encoding=" ...
- CodeForces 731A Night at the Museum
A. Night at the Museum time limit per test 1 second memory limit per test 256 megabytes input standa ...
- [报错]编译报错:clang: error: linker command failed with exit code 1及duplicate symbol xxxx in错误解决方法之一
今天添加了一个新类(包括m,h,xib文件),还没有调用,—编译遇到如下错误,根据错误提示, duplicate symbol param1 in: /Users/xxxx/Library/Devel ...
- 设计模式——抽象工厂模式
Abstract Factory模式,即抽象工厂模式,该模式要求Factory类为抽象的,并且里面的生产出来的产品也是抽象的! 这里需要着重说的一点就是,抽象类和抽象方法的作用--规范了子类的实现,以 ...
- TypeError: cannot use a string pattern on a bytes-like object的解决办法
#!/usr/python3 import re import urllib.request def gethtml(url): page=urllib.request.urlopen(url) ht ...
- vue状态管理器(用户登录简单应用)
技术点:通过vue状态管理器,对已经登录的用户显示不同的页面: 一 vue之状态管理器应用 主要用来存储cookie信息 与vue-cookies一起使用 安装:npm install vue-co ...
- 【Unity Shader编程】之十六 基于MatCap实现适于移动平台的“次时代”车漆Shader
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/55803629 渲染本文配图使用的 ...
- httprunner上传文件multipart/form-data
Content-Type = multipart/form-data#上传文件 Rquest Payload ------WebKitFormBoundarymAyGmnyhpf3UBdec C ...
- 抄送(Carbon Copy)
邮件中的抄送 举例,如果A发送邮件给B1,B2,B3,抄送给C1,C2,C3,密送给D1,D2,D3 那么: A知道自己将邮件发送给了B1,B2,B3,抄送给了C1,C2,C3,密送给了D1,D2,D ...