[Swift]自定義隊(duì)列Queue索引超界

本身這個(gè)問題并不難锦积,主要是支持enqueue和dequeue方法。網(wǎng)上有很多例子瞬捕,這里不贅述鞍历。
為了支持for in 循環(huán),一般還會(huì)實(shí)現(xiàn)Sequence協(xié)議肪虎。

網(wǎng)上個(gè)別例子可能在swift 4就會(huì)有錯(cuò)誤堰燎。
因?yàn)橥瑫r(shí)實(shí)現(xiàn)了Collection之類的協(xié)議,導(dǎo)致隱藏了對(duì)Sequence實(shí)現(xiàn)的問題笋轨。

當(dāng)for in 的集合元素為0個(gè)時(shí)會(huì)發(fā)生索引超界異常秆剪。

是makeIterator,不是generate

如果是在一個(gè)純凈的環(huán)境實(shí)現(xiàn)了Sequence 爵政,寫成generate馬上就編譯報(bào)錯(cuò)了仅讽,但是如果同時(shí)跟Collection之類的協(xié)議有關(guān)系,因?yàn)镃ollection繼承自Sequence钾挟,會(huì)導(dǎo)致問題被隱藏起來了洁灵。

 //擴(kuò)展隊(duì)列的for...in循環(huán)功能
extension Cat008_Queue: Sequence {

    // 從序列中返回一個(gè)迭代器
    //public func generate() -> AnyIterator<T> { //這個(gè)方法無效并不存在于 Sequence
    public func makeIterator() -> AnyIterator<T>  {
        return AnyIterator(IndexingIterator(_elements: data.lazy))
    }
}

隊(duì)列實(shí)現(xiàn)的簡(jiǎn)單基本功能代碼


// 定義一個(gè)隊(duì)列結(jié)構(gòu)
public struct Cat008_Queue<T> {

    // 數(shù)組用來存儲(chǔ)數(shù)據(jù)元素
    private var data = [T]()
    
    // 構(gòu)造方法,用于構(gòu)建一個(gè)空的隊(duì)列
    public init() {}
    
    
    // 將類型為T的數(shù)據(jù)元素添加到隊(duì)列的末尾
    public mutating func enqueue(element: T) {
        data.append(element)
    }
    
    // 移除并返回隊(duì)列中第一個(gè)元素
    // 如果隊(duì)列不為空掺出,則返回隊(duì)列中第一個(gè)類型為T的元素徽千;否則,返回nil汤锨。
    public mutating func dequeue() -> T? {
        return data.removeFirst()
    }
    
    // 清空隊(duì)列中的數(shù)據(jù)元素
    public mutating func clear() {
        data.removeAll()
    }
}

 //擴(kuò)展隊(duì)列的for...in循環(huán)功能
extension Cat008_Queue: Sequence {

    // 從序列中返回一個(gè)迭代器
    //public func generate() -> AnyIterator<T> { //這個(gè)方法無效并不存在于 Sequence
    public func makeIterator() -> AnyIterator<T>  {
        return AnyIterator(IndexingIterator(_elements: data.lazy))
    }
}

測(cè)試方法

func runTest() {
        
        var k = Cat008_Queue<Int>()
        k.enqueue(element: 2)
        k.enqueue(element: 5)
        for item in k {
            print(item)
        }
        
        //在受到extension了其他collcetion類干擾的情況下双抽,
        //對(duì)Sequence的擴(kuò)展中寫的方法名是generate(),則在
        //for循環(huán)的集合元素個(gè)數(shù)=0時(shí)會(huì)崩潰闲礼,下標(biāo)超界
        var mm = Cat008_Queue<Int>()
        for item in mm {
            print(item)
        }
        
        print("end \(type(of:self)) test")
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牍汹,一起剝皮案震驚了整個(gè)濱河市铐维,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慎菲,老刑警劉巖嫁蛇,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異露该,居然都是意外死亡睬棚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門解幼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抑党,“玉大人,你說我怎么就攤上這事书幕⌒禄纾” “怎么了揽趾?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵台汇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我篱瞎,道長(zhǎng)苟呐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任俐筋,我火速辦了婚禮牵素,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澄者。我一直安慰自己笆呆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布粱挡。 她就那樣靜靜地躺著赠幕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪询筏。 梳的紋絲不亂的頭發(fā)上榕堰,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音嫌套,去河邊找鬼逆屡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛踱讨,可吹牛的內(nèi)容都是我干的魏蔗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼痹筛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沫勿!你這毒婦竟也來了挨约?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤产雹,失蹤者是張志新(化名)和其女友劉穎诫惭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔓挖,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夕土,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘟判。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怨绣。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拷获,靈堂內(nèi)的尸體忽然破棺而出篮撑,到底是詐尸還是另有隱情,我是刑警寧澤匆瓜,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布赢笨,位于F島的核電站,受9級(jí)特大地震影響驮吱,放射性物質(zhì)發(fā)生泄漏茧妒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一左冬、第九天 我趴在偏房一處隱蔽的房頂上張望桐筏。 院中可真熱鬧,春花似錦拇砰、人聲如沸梅忌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牧氮。三九已至,卻和暖如春皂岔,著一層夾襖步出監(jiān)牢的瞬間蹋笼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工躁垛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剖毯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓教馆,卻偏偏與公主長(zhǎng)得像逊谋,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子土铺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 前言 集合(Collection)是建立在序列(sequence)上層的類型胶滋,它添加了可重復(fù)遍歷元素和根據(jù)下標(biāo)訪問...
    iOS開發(fā)攻城獅閱讀 817評(píng)論 0 0
  • 一板鬓、Designing Your Data Source and Delegate Every collectio...
    零點(diǎn)知晨閱讀 421評(píng)論 0 0
  • 隊(duì)列(Queue)是一種先入先出(First in First Out,簡(jiǎn)稱FIFO)的數(shù)據(jù)結(jié)構(gòu)究恤。想象一下俭令,在排隊(duì)...
    落葉刺客閱讀 3,617評(píng)論 1 3
  • 人類的身體 最早是馬匹 然后演變成火車 現(xiàn)在進(jìn)化成了飛機(jī) 馬匹時(shí)代 靈魂駕馭著白駒 萬馬奔騰,點(diǎn)燃遠(yuǎn)方的山脈 睡眠...
    Love_999閱讀 180評(píng)論 0 1
  • 18.4.26晚我流下了傷心的淚水部宿,摻雜著太多情緒抄腔,我想說離婚吧
    鴻雁南歸閱讀 195評(píng)論 0 0