Swift中泛型可以将类型参数化,提高代码复用率,减少代码量。
一、泛型函数
【 例 】
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var a = 10
var b = 20
swapValues(&a, &b)
print(a,b)
}
func swapValues(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
}
上述代码中,我们的a,b都是Int类型,如果我们有其它类型的,比如double,float,long double等类型,就不需要函数重载,可以直接通过泛型来解决这个场景的需求。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var a = 10
var b = 20
swapValues(&a, &b)
print(a,b)
var a2 = 10.0
var b2 = 20.0
swapValues(&a2, &b2)
print(a2,b2)
}
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
}
【 注意 】
- <T> 不能去掉,否则报错,不能识别类型;
01.png
2.传入的参数类型需要统一,否则包类型错误;
01.png
3.泛型函数赋值给变量,需要在变量后面明确类型;
03.png
二、泛型类型
泛型类型必须加<E>泛型这种格式来创建使用的,如开发中常见的出栈入栈示例:
【 例 -(类) 】
/// 随意泛型类型在类中的示例代码
/// E代表泛型名称,可随意写
class Stack<E> {
var elements = [E]()
func push(_ element : E) {
elements.append(element)
}
func pop() -> E {
return elements.removeLast()
}
func top() -> E {
elements.last!
}
func size() -> Int {
elements.count
}
}
泛型类型使用方式如下所示:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var intStack = Stack<Int>()
var stringStack = Stack<String>()
var anyStack = Stack<Any>()
}
}
![](https://img.haomeiwen.com/i1672235/d667402fdf7d96b0.png)
注意: 如果创建的时候没有<Int>,则会报错如下:
![](https://img.haomeiwen.com/i1672235/eefcf3f6ff846c65.png)
加<Int>或<String>,目的就是为了确定类型,当类型确定则可正确创建泛型类型。
【 例 -(结构体) 】
但类和结构体还是有些区别,如果上述Stack声明为struct,则需要加mutating
关键字,否则会报错:
![](https://img.haomeiwen.com/i1672235/b06b596d8331f3f1.png)
正确写法如下:
struct Stack<E> {
var elements = [E]()
mutating func push(_ element : E) {
elements.append(element)
}
mutating func pop() -> E {
return elements.removeLast()
}
func top() -> E {
elements.last!
}
func size() -> Int {
elements.count
}
}
【 例 -(枚举) 】
同理,泛型类型也可以在枚举中使用,如下所示:
enum Score<E> {
case point(E)
case grade(String)
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let score = Score<Int>.point(60)
let score2 = Score<Double>.point(60.0)
let score3 = Score<String>.point("60")
let score4 = Score<String>.grade("A")
}
}
泛型类型的学习记录至此,方便日后查阅学习。
网友评论