3. Swift Sequence

weixin_34185560發表於2017-03-29

Sequence是集合類資料結構中的一個基礎協議。

協議是個什麼東西?

我們使用一個比較簡單的協議來舉個例子:Equatable協議。
其定義為:

public protocol Equatable {
    public static func ==(lhs: Self, rhs: Self) -> Bool
}

StringInt中我們可以找到,但是並看不到具體實現。但是我們可以知道 2個str相等那麼就必須str的每個字母都相同,2個int相等沒啥好說的。那麼比較2個字典呢,我們到標頭檔案裡面看,他分別是key和value遵守了這個協議。還有其他型別的資料結構,我們也可以遵守這個協議,並實現相應的方法。
從此我們可以理解為定義協議就是為了讓我們更好的用更自然更統一的方式去表達相近的邏輯,更好的管理物件導向程式設計中比較類似邏輯的一種手段(純屬個人理解,不喜勿噴?)。比如 2==2 、 [] == [] 、 小明 == 小明 我們程式中判斷2個東西是否相同,這個相同就可以用==表示,具體怎麼相同我們規定了一個比較函式,具體比較規則自己去實現。
一個簡單例子:

struct MLJ: Equatable {
    var a: String = ""
    var b: String = ""
    static public func ==(lhs: MLJ, rhs: MLJ) -> Bool {
        if lhs.a == rhs.a && lhs.b == rhs.b  {
            return true
        } else {
            return false
        }
    }
}

滿足Sequence 協議的要求十分簡單,你需要做的所有事情就是提供一個返回迭代器 的makeIterator()方法。

// 每次產生一個 99 的迭代器
struct AIterator: IteratorProtocol {
    typealias Element = Int
    mutating func next() -> AIterator.Element? {
        return 99
    }
}

struct BSequence: Sequence {
    func makeIterator() -> AIterator {
        return AIterator()
    }
}
// 會一直列印99 不會終止
 let bs = BSequence()
 for b in bs {
       print(b)
}

Tips:


  • associatedtype這個東西一般用於協議裡面使用泛型的時候使用,所謂的泛型就是任意型別。
  • typealias 定義一個型別。

相關文章