一、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开发之泛型实例的更多相关文章

  1. 《Swift开发指南》

    <Swift开发指南> 基本信息 作者: 关东升    赵志荣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115366245 上架时间:2014-8-5 出版日期:20 ...

  2. 《Swift开发指南》国内第一本Swift图书上市了

    <Swift开发指南>国内第一本Swift图书上市了 既<courseId=799262">苹果Swift编程语言开发指南>视频教程地址:courseId=79 ...

  3. Swift开发学习(一):初始篇

    http://blog.csdn.net/powerlly/article/details/29351103 Swift开发学习:初始篇 关于 苹果公司于WWDC2014(Apple Worldwid ...

  4. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  5. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  6. Swift开发语法

    Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...

  7. Swift开发常用知识点

    #pragma mark - as/类型转换as? / as! 需要根据前面的返回值决定 有?证明可选,可能为空:需要弱解包 没有?证明一定有值:大胆解包 as? 前面的结果是可选的 if let / ...

  8. Swift 开发语法

    文/Tuberose(简书作者)原文链接:http://www.jianshu.com/p/5e2d4c34f18e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 简介 Swift 语 ...

  9. 高阶函数---swift中的泛型介绍(一步步实现Map函数)

    说明 本文内容均出自函数式 Swift一书, 此处整理仅仅是为了自己日后方便查看, 需要深入研究的话, 可以点进去购买, 支持原作者 本书由 王巍–新浪微博大神翻译 OneV's Den 喵神博客 接 ...

随机推荐

  1. Jquery 中的 event、event.target 和原生JS的 event、event.target 对比

    先看下原生的 event,如图: 再看下 Jquery 中的 event,如图: 明显不一样,也符合常理,比较结果: 那么如何把 Jquery 中的 event 转成原生的呢?  event.orig ...

  2. [Android Tips] 17. 查看 APK 签名信息

    从 APK 文件中获取签名信息 方法一 $ keytool -list -printcert -jarfile <path of APK> 方法二 解压 APK 文件,释放出 META-I ...

  3. 160524、Linux下如何启动、关闭Oracle以及打开关闭监听

    1. linux下启动oraclesu - oraclesqlplus /nologconn /as sysdbastartupexitlsnrctl startexit2. linux下关闭orac ...

  4. FZU 2140 Forever 0.5(找规律,几何)

    Problem 2140 Forever 0.5 Accept: 371 Submit: 1307 Special Judge Time Limit: 1000 mSec Memory Limit : ...

  5. 一百本英文原著之旅 ( 15 finished )

    记得去年毕业的时候,突然想看英文原著(小说.文学.技术 etc.)来提高自己的英文水平.并且那时候愣愣的有了个宏伟的目标 --> 一百本.  不过也就去年下半年断断续续的看了些页数在200左右的 ...

  6. 联合约束 CONCAT()

    w SELECT 原理. SELECT * FROM wz WHERE CONCAT(wint,wchar) NOT IN (SELECT CONCAT(wint,wchar) FROM wa); S ...

  7. python基础-第九篇-9.1初了解Python线程、进程、协程

    了解相关概念之前,我们先来看一张图 进程: 优点:同时利用多个cpu,能够同时进行多个操作 缺点:耗费资源(重新开辟内存空间) 线程: 优点:共享内存,IO操作时候,创造并发操作 缺点:抢占资源 通过 ...

  8. linux 这是定时任务

    1. 编写shell脚本:vim test.sh #/bin/bash echo "hello world" 2.crontab任务配置基本格式: *   * * * * comm ...

  9. python学习笔记(五)os、sys模块

     一.os模块 print(os.name) #输出字符串指示正在使用的平台.如果是window 则用'nt'表示,对于Linux/Unix用户,它是'posix'. print(os.getcwd( ...

  10. 专项训练知识点与错题整理-nowcoder-c++

    1- 来自:http://www.cskaoyan.com/thread-595813-1-1.html 1.拷贝构造函数 转自:https://www.cnblogs.com/alantu2018/ ...