美文网首页iOS学习开发
Swift的编程利器-泛型

Swift的编程利器-泛型

作者: howard0103 | 来源:发表于2019-05-09 15:32 被阅读124次

引言

在搭建项目框架时,我们通常会写很多通用代码。通用代码就必须要求灵活性和扩展性了。比如有两个非常相似的模块,只是一个是处理int类型,另一个处理string类型,或者是其它数据类型,当然我们可以分别写不同的方法来分别处理,也可以在一个方法里面用if-elseif来分别处理。但这样的代码太复杂,灵活性和扩展性都不高。要解决这个问题怎么办呢?
泛型就是为了解决这个问题产生的。很多编程语言里都有泛型,在做Android项目时就使用过java语言里的泛型,当时就感觉非常友好,灵活非常高。
今天我们来聊聊swift语言中的泛型,oc语言中本来是没有泛型的,新的xcode在swift的影响下才给oc加入了泛型并且也是伪泛型。

swift泛型

为什么要使用泛型

泛型是为了编程更加的灵活,避免重复的代码,清晰和抽象的方式来表达代码的意图。
为了解释这句话,下面举个简单的例子来说明
场景一:写一个方法把Int变量A和Int变量B的值交换一下

//1 定义一个方法
func exchange(a: Int, b:Int) {
    let temp = a
    a = b
    b = temp
}
//2 具体使用
var oneInt = 1
var twoInt = 2
exchange(a:&oneInt, b:&twoInt)
print("oneInt= \(oneInt), twoInt= \(twoInt)") //打印: oneInt=2,twoInt=1

场景二:写一个方法把String变量A和String变量B的值交换一下

//1 定义一个方法
func exchange(a: String, b:String) {
    let temp = a
    a = b
    b = temp
}
//2 具体使用
var oneStr= "str1"
var twoStr= "str2"
exchange(a:&oneStr, b:&twoStr)
print("one= \(oneStr), twoStr= \(twoStr)") //打印: oneStr=str2,twoStr=str1

大家想必已经发现问题了吧,场景一和场景二非常的类似,只是处理的数据类型不一样,如果还想处理其它数据类型呢?这样实现就太复杂了。
使用泛型便可解决这个问题。

我们来看看利用泛型是如何实现的

//1 定义一个泛型方法
func exchange<T>(a: T, b:T) {
    let temp = a
    a = b
    b = temp
}
//2 具体使用
var oneInt = 1
var twoInt = 2
exchange(a:&oneInt, b:&twoInt)
print("oneInt= \(oneInt), twoInt= \(twoInt)") //打印: oneInt=2,twoInt=1

var oneStr= "str1"
var twoStr= "str2"
exchange(a:&oneStr, b:&twoStr)
print("one= \(oneStr), twoStr= \(twoStr)") //打印: oneStr=str2,twoStr=str1

定义一个方法,随意使用,太棒了!

泛型 vs Any

泛型可以指定任意类型,这个时候大家应该会联想到Any,Any也是可以指定任意类型的,话不多说,先上一段代码,大家来看看他们的区别

//函数一
func method1<T>(a: T, b: T) ->T {
     ...
}
//函数二
func method2(a: Any, b: Any) ->Any {
     ...
}

看到他们的区别了吧
相同之处:
a,b参数类型和返回值类型都可以是任意类型
不同之处:
函数一中a,b两参数和返回值类型必须是同一类型T
函数二中a,b两参数和返回值类型都可以是任意类型,不一定相同
为什么会这样呢?
因为泛型的类型检查是由编译器负责的,而Any类型则避开了类型检查。
这里便体现了泛型的一大优点:安全性强。
为什么会这样说呢?因为使用泛型程序在编译的时候,就会帮我们发现问题,而使用Any,程序就只有在运行的时候发现问题了。尽量要把Bug消灭在摇篮中呀!

AnyObject?
大家会不会想到AnyObject,其实这个并不是任意类型,它只是用于任何类(class)的实例。比如基本数据类型,值类型就不能用AnyObject来修饰

泛型是如何使用的呢?
  • 泛型函数
func exchange<T>(a: T, b:T) {
     ...
}
  • 泛型类型
struct ClassA<T> {
     var arr = [T]()
     mutating func add(item: T) {
         arr.append(item) 
    }
}
  • 泛型约束
func methodXXX<T: ClassXXX>(param: T) {
     ...
}
  • 泛型协议
protocol MyProtocol {
   //声明一个关联类型,使用associatedtype关键字
   associatedtype ItemType
}
func methodXXX<T1: MyProtocol, T2: MyProtocol where T1.ItemType == T2.ItemType>(param1: T1, param2: T2) {
    ...
}

这里T1和T2都遵循了MyProtocol协议,并且T1和T2包含的泛型类型是一致的

总结

  • 泛型不管在java和swift语言中都有很重要的地位,我们应该好好去挖掘里面的知识点
  • 使用泛型可以大大简化代码,尤其在写通用性强的代码时
  • 学会了泛型编程,会让你的编程水平上一个新的台阶

如果有任何问题,或者有什么想法,随时联系我,大家一起交流,共同进步。
我的邮箱 344185723@qq.com

相关文章

  • Swift的编程利器-泛型

    引言 在搭建项目框架时,我们通常会写很多通用代码。通用代码就必须要求灵活性和扩展性了。比如有两个非常相似的模块,只...

  • Swift语法学习

    1.Swift既支持面向过程的编程机制,也支持面向对象的编程方式。(c++支持泛型编程,mark泛型编程) 2.S...

  • 泛型

    泛型 1.为什么要有泛型?2.泛型有什么好处?3.Swift泛型语法4.泛型的使用 为什么要有泛型 在编程世界中,...

  • 从Swift函数式编程到设计模式(二)

    Swift是一门多范式编程语言。除了支持面向对象编程范式之外,还支持函数式编程范式,和泛型编程。这使得Swift可...

  • iOS学习笔记47-Swift(七)泛型

    一、Swift泛型介绍 泛型是为Swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引...

  • Swift 中的泛型

    Swift泛型介绍 泛型是为Swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引入可...

  • swift泛型

    一、swift泛型介绍 泛型是为swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引...

  • # Swift学习 # 简单面试题

    1.什么是函数式编程? 2.swift相对于OC有哪些优点? 3.什么是泛型,swift在哪些地方使用了泛型? 4...

  • 多态-iOS

    Swift中的泛型T 实质是一种参数化多态,把类型作为参数的多态,泛型编程。 在编程语言和类型论中,多态是指不同数...

  • Swift-泛型笔记

    Swift 泛型 Swift 提供了泛型让你写出灵活且可重用的函数和类型。 Swift 标准库是通过泛型代码构建出...

网友评论

    本文标题:Swift的编程利器-泛型

    本文链接:https://www.haomeiwen.com/subject/xgdwoqtx.html