數(shù)組(NSArray)、字典(NSDictionary)、NSSet的遍歷

有段時間沒寫東西了,今天整理了下關(guān)于數(shù)組、字典、NSSet的遍歷,供大家參考。

首先需要注意數(shù)組是有序的,字典和set是無序的。

for

for是最基本的循環(huán)方法,也是初學(xué)者用的最多的循環(huán)方法了。

NSArray * arr = @[...];
for (int i = 0; i < arr.count; i++) {
    id obj = arr[i];
    ....
}

NSDictionary * dict =@{...};
NSArray * keys = [dict allKeys];
for (int i = 0; i < keys.count; i++) {
    id key = key[i];
    id value = dict[key];
    ...
}

NSSet * aSet = (NSSet *)@[...];
NSArray * objects = [aSet allObjects];
for (int i = 0; i < objects.count; i++) {
    id object = objects[i];
    ...
}

for循環(huán)可正反遍歷,可從中間開始遍歷,可獲取元素對應(yīng)下標(biāo)(字典和set無序故下標(biāo)無意義),缺點(diǎn)是效率低,且遍歷字典和set的時候還需要引入中介數(shù)組。

NSEnumerator(Objective-C 1.0)

NSEnumeratro 主要調(diào)用- (id)nextObject這個方法,它返回枚舉里的下一個對象。當(dāng)下一個調(diào)用返回為nil的時候,就表示遍歷結(jié)束了。

NSArray * arr = @[...];
NSEnumerator * enumerator = [arr objectEnumerator];
//換成NSEnumerator * enumerator =[arr reverseObjectEnumerator]則為反向遍歷
id object;
while (object = [enumerator nextObject])    {
    ...
}

NSDictionary * dict = @{...};
NSEnumerator * enumerator = [dict keyEnumerator];
id key;
while ((key = [enumerator nextObject]) != nil) {
    id value = dict[key];
    ...
}

NSSet * aSet = (NSSet *)@[...];
NSEnumerator * enumerator = [aSet objectEnumerator];
id object;
while ((object = [enumerator nextObject]) != nil) {
    ...
}

for-in (Objective-C 2.0)

NSArray * arr = @[...];
for (id object in arr) {
    ...此為正向遍歷
}
for (id object in [arr reverseObjectEnumerator]) {
    ...此為反向遍歷
}

NSDictionary * dict = @{...};
for (id key in dict) {
    id value = dict[key]
}

NSSet * aSet = (NSSet *)@[...];
for (id object in aSet) {
    ...
}

for-in的效率高于for 和 NSEnumerator,缺點(diǎn)是無法獲取元素下標(biāo)。

block

NSArray * arr = @[...];
[arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {//正向遍歷
    ...
    if  (...){
        *stop = YES;//遍歷停止
    }
}];
[arr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {//反向遍歷
    ...
    if  (...) {
        *stop = YES;
    }
}];

NSDictionary * dict = @{...};
[dict enumerateKeysAndObjectsUsingBlock:^(id key,id object,BOOL * stop) {
    ...
    if  (...) {
        *stop = YES;
    }
}];

NSSet * aSet = (NSSet *)@[...];
[aSet enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {
    ...
    if (...) {
        *stop = YES;
    }
}];

此方法高效、可隨時停止遍歷,可獲取下標(biāo),缺點(diǎn)是沒有for-in簡潔,根據(jù)需要選取相應(yīng)的遍歷方式即可。

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品,歡迎轉(zhuǎn)載,轉(zhuǎn)載時請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容