Swift標準庫源碼之旅 - Zip.swift

zip在Swift里是一個全局函數(shù),參數(shù)接收兩個Sequence仁热,返回一個可以遍歷兩個sequenceElement的元組Zip2Sequence.

使用舉例

目前項目中有一個視圖模型ViewModeltitleimage屬性,用來給視圖賦值用。

struct ViewModel {
  let title: String
  let image: UIImage
}

這里面的title和image都是直接在本地進行配置死嗦,總共有5個。

第一種常規(guī)方式我們可以這樣

let viewModel1 = ViewModel(title: "1", image: image1)
let viewModel2 = ViewModel(title: "2", image: image2)
let viewModel3 = ViewModel(title: "3", image: image3)
let viewModel4 = ViewModel(title: "4", image: image4)
let viewModel5 = ViewModel(title: "5", image: image5)
let viewModels = [viewModel1, xxx]

但是調(diào)用五次構(gòu)造方法不是個好的方式粒氧,若是viewModel將來擴展一個參數(shù)越除,我們5個構(gòu)造函數(shù)都需要更改。數(shù)據(jù)的配置構(gòu)建沒有分層

第二種方式:

let titles: [String] = ["1", "2", "3", "4", "5"]
let images: [UIImage] = [image1, image2,image3,image4,image5]

var viewModels: [ViewModel] = []
for i in 0 ..< titles.count {
  viewModels.append(ViewModel(title: titles[i], image: images[i])
}

解決了第一種方式提到的問題.配置數(shù)據(jù)和構(gòu)建模型是分開的. 構(gòu)造方法也只調(diào)用了一次.但是使用下標從數(shù)組里取值還有更優(yōu)雅的方式.

使用zip

let titles: [String] = ["1", "2", "3", "4", "5"]
let images: [UIImage] = [image1, image2,image3,image4,image5]

let viewModels = zip(titles, images).map(ViewModel.init)

除了元素的配置,構(gòu)建viewModel數(shù)組只需要一行代碼就搞定了.
zip方法在兩個Sequence中其中一個沒有next元素了就進行了停止.

那么如果ViewModel不是有兩個元素而是三個呢. 可以選擇zip嵌套或者ViewModel屬性里用元組的方式.

zip(array1, zip(array2, array3)).map {
      ViewModel.init(a: $0, b: $1.0, c: $1.1)
}

實現(xiàn)

核心就是zip函數(shù)返回的Zip2Sequence序列的Iterator方法摘盆,也就是next函數(shù).
思路就是將兩個sequence全都保存下來,迭代的時候取兩個sequence的迭代方法,只要有一個返回了nil就返回nil翼雀,取到值就包到元組里進行返回,比較簡單.

class Zip2Sequence<S1: MySequence, S2: MySequence>: MySequence {
    typealias Element = (S1.Element, S2.Element)
    
    typealias Iterator = Interator
    let _sequence1: S1
    let _sequence2: S2
    
    init(base1: S1, base2: S2) {
        _sequence1 = base1
        _sequence2 = base2
    }
    
    func makeIterator() -> Interator {
        Interator(it1: _sequence1.makeIterator(), it2: _sequence2.makeIterator())
    }
}

extension Zip2Sequence {
    struct Interator: MyIteratorProtocol {
        
        var it1: S1.Iterator
        var it2: S2.Iterator
        
        init(it1: S1.Iterator, it2: S2.Iterator) {
            (self.it1, self.it2) = (it1, it2)
        }
        
        mutating func next() -> (S1.Element, S2.Element)? {
            guard let e1 = it1.next(), let e2 = it2.next() else {
                return nil
            }
            return (e1, e2)
        }
    }
}

其實根據(jù)實現(xiàn)骡澈,我們也比較容易實現(xiàn)一個Zip3Sequence,或者可以接收一個Sequence數(shù)組的zip.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锅纺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肋殴,更是在濱河造成了極大的恐慌囤锉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件护锤,死亡現(xiàn)場離奇詭異官地,居然都是意外死亡,警方通過查閱死者的電腦和手機烙懦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門驱入,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氯析,你說我怎么就攤上這事亏较。” “怎么了掩缓?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵雪情,是天一觀的道長。 經(jīng)常有香客問我你辣,道長巡通,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任舍哄,我火速辦了婚禮宴凉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘表悬。我一直安慰自己弥锄,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布蟆沫。 她就那樣靜靜地躺著叉讥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饥追。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天罐盔,我揣著相機與錄音但绕,去河邊找鬼。 笑死,一個胖子當著我的面吹牛捏顺,可吹牛的內(nèi)容都是我干的六孵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幅骄,長吁一口氣:“原來是場噩夢啊……” “哼劫窒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拆座,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤主巍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挪凑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孕索,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年躏碳,在試婚紗的時候發(fā)現(xiàn)自己被綠了搞旭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡菇绵,死狀恐怖肄渗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咬最,我是刑警寧澤翎嫡,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站丹诀,受9級特大地震影響钝的,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铆遭,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一硝桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枚荣,春花似錦碗脊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至害碾,卻和暖如春矢劲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慌随。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工芬沉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躺同,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓丸逸,卻偏偏與公主長得像蹋艺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子黄刚,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354