Swift - 泛型
2022-03-02 本文已影响0人
aven_kang
var n1 = 10
var n2 = 20
func swapValues(_ a:inout Int,_ b: inout Int) {
(a,b) = (b,a)
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
swapValues(&n1, &n2)
}
}
在上面的函数中,参数的作用是交换两个值,参数类型也是固定的Int类型
如果我们需要交换两个Double,或者字符串,或者别的,是不是就会出现很多的swapValues函数,那么有没有一种解决方案,一个函数,多种用途
那就是泛型的操作
func swapValues<T>(_ a:inout T,_ b: inout T) {
(a,b) = (b,a)
}
那么此时的T,是可以代替各种类型的值
在传递第一个参数的时候,参数的类型就已经传递给了<T>,那么就决定了后面参数的类型是什么了。
示例
class Stack {
var elements = [Int]()
func push(_ element: Int) {
elements.append(element)
}
func pop() -> Int {
return elements.removeLast()
}
func top() -> Int {
elements.last!
}
}
上述代码中,做了一个简易的入栈出栈功能,但是功能上,是指定的是Int类型,如果改成泛型怎么做呢
class Stack<E> {
var elements = [E]()
func push(_ element: E) {
elements.append(element)
}
func pop() -> E {
return elements.removeLast()
}
func top() -> E {
elements.last!
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var stc = Stack<Int>()
}
}
关联类型
关联类型的作用:给协议中用到的类型定义个占位名称
协议中可以拥有多个关联类型
protocol Stackable {
associatedtype Element
// associatedtype Element2 可以拥有多个关联类型
mutating func push(_ element:Element)
mutating func pop() -> Element
func top() -> Element
func size() -> Int
}
class StringStack : Stackable {
typealias Element = String
var elemets = [String]()
func push(_ element: String) {
}
func pop() -> String {
}
func top() -> String {
}
func size() -> Int {
}
}
class stack<E> : Stackable {
typealias Element = E
var elements = [E]()
func push(_ element: E) {
}
func pop() -> E {
}
func top() -> E {
}
func size() -> Int {
return 0
}
}
截屏2022-02-26 下午2.08.44.png