iOS 開發(fā)之避坑指南 (不定期更新)<Fatal error: Index out of range>

最近在用 Swift 寫自己的新項(xiàng)目 Fontzar, 擼了個(gè)遍歷時(shí)移除不符合條件的值的碼然后 build and run, 崩了遇伞!沒錯(cuò)是崩了!報(bào)了個(gè)Fatal error: Index out of range

var arr = ["a","c","a"]

for (idx, value) in arr.enumerated() {
    if value == "a" {
        arr.remove(at: idx)
    }
}

print(arr)

同樣代碼用 OC 寫不會(huì)蹦!祈纯?!

NSMutableArray *arr = @[@"a",@"c",@"a"].mutableCopy;

[arr enumerateObjectsUsingBlock:^(NSString* str, NSUInteger idx, BOOL * _Nonnull stop) {
    if ([str isEqualToString:@"a"]) {
        [arr removeObjectAtIndex:idx];
    }
}];

NSLog(@"%@", tempMArr);

我覺得在 Swift 中崩潰是因?yàn)?Swift 是安全的,讓我們提前發(fā)現(xiàn)了問題拖吼。

Swift的特點(diǎn): 快速 現(xiàn)代 安全 互動(dòng)

注意: 遍歷中不能直接操控原數(shù)組,因?yàn)檫@會(huì)改變數(shù)組長度導(dǎo)然后導(dǎo)致隱藏 Bug,你檢查錯(cuò)誤都不知哪出問題了(請(qǐng)看下面的代碼)腺劣。

NSMutableArray *tempMArr = @[@"a",@"x",@"d",@"c",@"a",@"j",@"a",@"c",@"a",@"k",@"f"].mutableCopy;
NSArray *tempArr = @[@"a",@"b",@"c"];

[tempMArr enumerateObjectsUsingBlock:^(NSString* str, NSUInteger idx, BOOL * _Nonnull stop) {
    
    BOOL isExisted = NO;
    
    for (NSString *str2 in tempArr) {
        if ([str isEqualToString:str2]) {
            isExisted = YES;
            break;
        }
    }
    
    if (!isExisted) {
        [tempMArr removeObjectAtIndex:idx];
    }
}];
    
NSLog(@"tempMArr:%@", tempMArr);

控制臺(tái)打印出的結(jié)果:

tempMArr:(
    a,
    d,
    c,
    a,
    a,
    c,
    a,
    f
)

從打印出來的結(jié)果我們發(fā)現(xiàn)數(shù)組中多了 fd绿贞,這結(jié)果是不符合我們預(yù)期。從而證明了遍歷中不能操作原數(shù)組的真理橘原!

正確姿勢(shì):

  • 遍歷中把符合條件的值保存在新的數(shù)組里
  • 遍歷拷貝的數(shù)組籍铁,操作原數(shù)組
  • 倒序遍歷數(shù)組
  • 使用 Filter 函數(shù)filter(_:) Or filteredArrayUsingPredicate:

PS: 如果你用 Swift 開發(fā)時(shí)遇到了這個(gè)問題涡上,可能是因?yàn)槟阌?OC 時(shí)這么玩過,或者是你曾經(jīng)所看過的《iOS 中如何遍歷數(shù)組拒名?》系列的 Blog 本身就有問題吩愧,誤導(dǎo)你了或沒提醒你。提醒一下 除了 OC 以外的編程語言中就算允許你遍歷中操作原數(shù)組(不崩潰)也全力避免這種騷操作增显。最后記得審一下你的 OC 代碼 ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雁佳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子同云,更是在濱河造成了極大的恐慌糖权,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炸站,死亡現(xiàn)場(chǎng)離奇詭異星澳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旱易,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門禁偎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阀坏,你說我怎么就攤上這事如暖。” “怎么了忌堂?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盒至,是天一觀的道長。 經(jīng)常有香客問我浸船,道長妄迁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任李命,我火速辦了婚禮登淘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘封字。我一直安慰自己黔州,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布阔籽。 她就那樣靜靜地躺著流妻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笆制。 梳的紋絲不亂的頭發(fā)上绅这,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音在辆,去河邊找鬼证薇。 笑死度苔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浑度。 我是一名探鬼主播寇窑,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼箩张!你這毒婦竟也來了甩骏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤先慷,失蹤者是張志新(化名)和其女友劉穎饮笛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體论熙,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缎浇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赴肚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡二蓝,死狀恐怖誉券,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刊愚,我是刑警寧澤踊跟,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸥诽,受9級(jí)特大地震影響商玫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牡借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一拳昌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钠龙,春花似錦炬藤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咬腋,卻和暖如春羹膳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背根竿。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工陵像, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留就珠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓蠢壹,卻偏偏與公主長得像嗓违,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子图贸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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