有段時間沒寫東西了,今天整理了下關(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)的遍歷方式即可。