where 语句 & associatedtype 类型定义别名
我们先来看一段代码:
protocol StackProtocol {
associatedtype Item
var itemCount: Int{get}
mutating func pop() -> Item?
func index(of index: Int) -> Item
}
struct KZHStack: StackProtocol {
var itemCount: Int
typealias Item = Int
private var items = [Item]()
mutating func pop() -> Item? {
if items.isEmpty {
return nil
}
return items.removeLast()
}
func index(of index: Item) -> Item {
return items[index]
}
}
func compare<T1: StackProtocol, T2: StackProtocol>(_ stack1: T1, _ stack2: T2) -> Bool where T1.Item == T2.Item, T1.Item: Equatable {
guard stack1.itemCount == stack2.itemCount else {return false}
for i in 0..<stack1.itemCount {
if (stack1.index(of: i) != stack2.index(of: i)) {
return false
}
}
return true
}
有时候我们希望在当前泛型制定类型的时候拥有特定功能,我们来看⼀下下⾯的写法:
extension StackProtocol where Item == Int{
func test(){
print("test")
}
}
associatedtype 声明一个类型变量
typealias 设置类型别名