protocol Container {
associatedtype ItemType // <-- Here
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get } // <-- This is subscript
}
struct NewStack<Element>: Container {
// Stack<Element> 原實作的內容
var items = [Element]()
mutating func push(item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
// 原本應該要寫 typealias
// 但因為 Swift 會自動推斷型別 所以下面這行可以省略
// typealias ItemType = Element
// 協定 Container 實作的內容
mutating func append(item: Element) {
self.push(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Element {
return items[i]
}
}
Where語句
func allItemsMatch<
C1: Container, C2: Container
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
(someContainer: C1, _ anotherContainer: C2) -> Bool {
// 檢查兩個容器含有相同數量的元素
if someContainer.count != anotherContainer.count {
return false
}
// 檢查每一對元素是否相等
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}
// 所有條件都符合 返回 true
return true
}
參考資料:
- 泛型.Swift 起步走
相關