关联类型(Associated Type)

395 阅读1分钟

关联类型的作用:给协议中用到的类型定义一个占位名称

  • 协议中可以拥有多个关联类型
  • 由于协议中不能使用泛型,所以使用关联类型代替泛型,泛型只能用于class、struct
protocol Stackable {
	associatedtype Element // 关联类型
    mutating func push(_ element: Element) // mutating 不能用于class,可用于struct、enum, 可能被struct实现所以用mutating, 会改变struct的内存时要使用mutating
    mutating func pop() -> Element
    func top() -> Element
    func size() -> Int
}
class StringStack: Stackable {
	// 给关联类型设定类型
    // typealias Element = String
    // 或者
    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
    }
}

// 泛型代替具体的类型String
class Stack<E>: Stackable {
	// 给关联类型设定类型
    // typealias Element = E
    // 或者
    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 {
	// 给关联类型设定类型
    // typealias Element = String
    // 或者
    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")