防止序列為空

作者:Erica Sadun,原文鏈接吱涉,原文日期:2016-05-11
譯者:pucca刹泄;校對(duì):wiilen;定稿:CMB

昨天在 Swift-Users 有人提問(wèn)如何防止序列(sequence)為空怎爵。這個(gè)問(wèn)題來(lái)源于如何在斷言(predicate)中測(cè)試一個(gè)序列特石,由此引發(fā)的問(wèn)題是如果序列為空,會(huì)返回 true 來(lái)滿(mǎn)足斷言鳖链。

我們先不考慮這種處理是否有問(wèn)題(我認(rèn)為這種處理是正確的姆蘸,因?yàn)橐粋€(gè)空序列里沒(méi)有元素,對(duì)元素的斷言也就不會(huì)失斳轿)逞敷,Jeremy Pereira 提出了一個(gè)相當(dāng)巧妙的解決方案:

func all(@noescape where predicate: Generator.Element throws -> Bool) rethrows -> Bool {
    var count = 0
       for element in self {
        guard try predicate(element) else { return false }
        count += 1
       }
       return count > 0
}

但從此討論中延伸出的另一個(gè)大問(wèn)題是“如何優(yōu)雅地判斷一個(gè)序列是否為空?”灌侣。我的方法是用緩沖區(qū)(buffer)并進(jìn)行預(yù)處理推捐。以下是我的第一次嘗試,粗糙不堪侧啼,請(qǐng)不吝指教牛柒。

public struct BufferedSequence<Base : SequenceType>:GeneratorType, SequenceType {
    
    internal var _base: Base
    internal var _generator: Base.Generator
    public var bufferedElement: Base.Generator.Element?
    
    public init(_ base: Base) {
        _base = base
        _generator = base.generate()
        bufferedElement = _generator.next()
    }

    public mutating func next() -> Base.Generator.Element? {
        defer {
            if bufferedElement != nil {
                bufferedElement = _generator.next()
            }
        }
        return bufferedElement
    }
    
    public func isEmpty() -> Bool {
        return bufferedElement == nil
    }
}

有趣的是,寫(xiě)這個(gè)小東西最難的不是如何進(jìn)行預(yù)處理痊乾,而是將 Swift 3 的語(yǔ)法轉(zhuǎn)換回 Swift 2.2皮壁,這樣我就能在 playground 中進(jìn)行混編了。

你的語(yǔ)法轉(zhuǎn)換進(jìn)行的怎樣了符喝?已經(jīng)全部轉(zhuǎn)換成 3 的語(yǔ)法了?還是堅(jiān)守 2.2 寫(xiě)生產(chǎn)代碼甜孤?

本文由 SwiftGG 翻譯組翻譯协饲,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問(wèn) http://swift.gg缴川。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茉稠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子把夸,更是在濱河造成了極大的恐慌而线,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膀篮,居然都是意外死亡嘹狞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)誓竿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)磅网,“玉大人,你說(shuō)我怎么就攤上這事筷屡〗担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵毙死,是天一觀的道長(zhǎng)燎潮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)扼倘,這世上最難降的妖魔是什么确封? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮唉锌,結(jié)果婚禮上隅肥,老公的妹妹穿的比我還像新娘。我一直安慰自己袄简,他們只是感情好腥放,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著绿语,像睡著了一般秃症。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吕粹,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天种柑,我揣著相機(jī)與錄音,去河邊找鬼匹耕。 笑死聚请,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稳其。 我是一名探鬼主播驶赏,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼既鞠!你這毒婦竟也來(lái)了煤傍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嘱蛋,失蹤者是張志新(化名)和其女友劉穎蚯姆,沒(méi)想到半個(gè)月后五续,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡龄恋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年疙驾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篙挽。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荆萤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铣卡,到底是詐尸還是另有隱情链韭,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布煮落,位于F島的核電站敞峭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝉仇。R本人自食惡果不足惜旋讹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轿衔。 院中可真熱鬧沉迹,春花似錦、人聲如沸害驹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宛官。三九已至葫松,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間底洗,已是汗流浹背腋么。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亥揖,地道東北人珊擂。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像费变,于是被迫代替她去往敵國(guó)和親摧扇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 17年年初胡控,猴年年末扳剿,正是公司門(mén)湊堆辦年會(huì)的時(shí)節(jié)旁趟,辦公室興奮異常昼激,當(dāng)然核心是圍繞著抽獎(jiǎng)來(lái)的庇绽。 一同事興奮地跑過(guò)來(lái)說(shuō)...
    盒子很隨心閱讀 215評(píng)論 0 1
  • Face day cream 1個(gè) face pack 2個(gè) soap 1個(gè) face day cream 1個(gè) ...
    阿童旭閱讀 248評(píng)論 0 0
  • 之前還是小白的時(shí)候只想著存錢(qián),有了點(diǎn)小錢(qián)夏跷,想學(xué)點(diǎn)理財(cái)哼转,不說(shuō)通過(guò)理財(cái)賺到多少錢(qián),至少能讓自己的錢(qián)跑得過(guò)CPI(消費(fèi)者...
    歐尼在線閱讀 14,685評(píng)論 4 62
  • 沒(méi)有人可以替你做選擇 ...
    韓尼閱讀 316評(píng)論 3 1