关联类型的作用:给协议中用到的类型定义一个占位名称
- 协议中可以拥有多个关联类型
- 由于协议中不能使用泛型,所以使用关联类型代替泛型,泛型只能用于class、struct
protocol Stackable {
associatedtype Element
mutating func push(_ element: Element)
mutating func pop() -> Element
func top() -> Element
func size() -> Int
}
class StringStack: Stackable {
var elements = [String]()
func push(_ element: String) {
elements.append(element)
}
func pop() -> String {
elements.removeLast()
}
func top() -> String {
elements.last!
}
func size() -> Int {
elements.count
}
}
class Stack<E>: Stackable {
var elements = [E]()
func push(_ element: E) {
elements.append(element)
}
func pop() -> E {
elements.removeLast()
}
func top() -> E {
elements.last!
}
func size() -> Int {
elements.count
}
}
struct StringStack: Stackable {
var elements = [String]()
mutating func push(_ element: String) {
elements.append(element)
}
mutating func pop() -> String {
elements.removeLast()
}
func top() -> String {
elements.last!
}
func size() -> Int {
elements.count
}
}
var s = StringStack()
s.push("Jack")