[筆記] Swift深入淺出常見語法 – Protocol 實現Generic (泛型)

gray ceramic mug with pink beverage
分享
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
}

參考資料:

  1. 泛型.Swift 起步走

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *