最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中遍歷的方法總結(jié)

 更新時(shí)間:2017年04月27日 10:23:40   作者:Hyyy''s blog  
本篇文章主要介紹了iOS中遍歷的方法總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在iOS開(kāi)發(fā)中,可以使用多種方法進(jìn)行元素遍歷,具體有一下幾種:

經(jīng)典for循環(huán)

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (int i = 0; i < iosArray.count; i++) {
  //處理數(shù)組中數(shù)據(jù)
  NSLog(@"%@", iosArray[i]);
}

NSEnumerator遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
NSEnumerator *enumerator = [iosArray objectEnumerator];//正向遍歷
// NSEnumerator *enumerator = [iosArray reverseObjectEnumerator];//反向遍歷

id object;

while ((object = [enumerator nextObject]) != nil) {
  //處理枚舉器中的數(shù)據(jù)
  NSLog(@"%@", object);
}

for-in快速遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (NSString *obj in iosArray) {
  //處理數(shù)組中的數(shù)據(jù)
  NSLog(@"%@", obj);
}

EnumeratorBlock遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
[iosArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  NSLog(@"%@", obj);
  if ([obj isEqualToString:@"e"]) {
    *stop = YES;  // 跳出遍歷
  }
}];

另外,EnumeratorBlock還支持反向遍歷,并發(fā)遍歷,并發(fā)遍歷可以使用多核的優(yōu)化,充分利用系統(tǒng)的資源。

反向遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
[iosArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
  NSLog(@"%@", obj);
  if ([obj isEqualToString:@"e"]) {
    *stop = YES;
  }
}];

并發(fā)遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
NSMutableArray *iosMutableArray = [NSMutableArray arrayWithArray:iosArray];
[iosMutableArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
  obj = [NSString stringWithFormat:@"_%@", obj];
  [iosMutableArray replaceObjectAtIndex:idx withObject:obj];
  NSLog(@"%@", obj);

  if ([obj isEqualToString:@"_I"]) {
    *stop = YES;
  }
}];

dispatch_apply遍歷

dispatch_apply類似于for循環(huán),這里需要注意的是,dispatch_apple是同步調(diào)用,調(diào)用完畢返回結(jié)果,并且由于是GCD實(shí)現(xiàn),所以可以使用并發(fā)隊(duì)列或者是串行隊(duì)列。代碼如下:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
//  dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL); // 串行隊(duì)列
dispatch_apply(array.count, queue, ^(size_t i) {
  Enumerate *enumerate = [array objectAtIndex:i];
  NSLog(@"number: %ld", enumerate.number);
});

遍歷的注意事項(xiàng)

for循環(huán)中不要修改數(shù)組

遍歷過(guò)程中是不能隨便刪除遍歷的元素的,如果需要?jiǎng)h除元素,可以先復(fù)制一份出來(lái),比如如下的代碼會(huì)有問(wèn)題:

NSMutableArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (NSString *obj in iosArray) {
  //處理數(shù)組中的數(shù)據(jù)
  if([@"e" isEqualTo:obj]) {
    [iosArray removeObject:obj];
  }
}

但是使用enumerateBlock可以在block內(nèi)部做removeObject操作,原因應(yīng)該是和Block的特性有關(guān), 在Block中會(huì)保存變量的值,而不會(huì)隨變量的值的改變而改變 。

遍歷的速率

當(dāng)數(shù)組容量很大的時(shí)候,如果只是進(jìn)行數(shù)組遍歷的話,使用for-in是最快速的,其次是并發(fā)遍歷,這個(gè)很多人都以為enumerateBlock是最快的。

遍歷實(shí)踐tips

數(shù)組分組

在開(kāi)發(fā)中,有時(shí)需要對(duì)數(shù)組進(jìn)行某種情況的分組,比如,一個(gè)擁有很多消息模型的數(shù)組,我們需要根據(jù)消息的創(chuàng)建月份進(jìn)行分組,那么可以使用下面的方法實(shí)現(xiàn):

NSMutableSet *set=[NSMutableSet set];
NSArray *array = @[message1, message2, message3, message4, message5, message6, message7];
__block NSArray *tempDataArray = [NSArray arrayWithArray:array];
[tempDataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  [set addObject:obj.month];//利用set不重復(fù)的特性,得到有多少組,根據(jù)數(shù)組中消息的月份屬性
}];
[set enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {//遍歷set數(shù)組
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.month = %@", obj];//創(chuàng)建謂詞篩選器
  NSArray *group = [tempDataArray filteredArrayUsingPredicate:predicate];//用數(shù)組的過(guò)濾方法得到新的數(shù)組,在添加的最終的數(shù)組
}

倒序遍歷

倒序遍歷也很常見(jiàn),可以使用上面的反向遍歷來(lái)實(shí)現(xiàn)。

set排序

這個(gè)和Emunerate其實(shí)沒(méi)有關(guān)系,但是也很實(shí)用,我們知道set是無(wú)序的,但是有時(shí)需要實(shí)現(xiàn)有順序的set,可以使用下面來(lái)實(shí)現(xiàn):

//由于set無(wú)序,現(xiàn)將set轉(zhuǎn)換成nsarray
NSArray *sortDescriptor = @[[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO]];
NSArray *sortSetArray = [set sortedArrayUsingDescriptors:sortDescriptor];

其實(shí)原理是將set轉(zhuǎn)化成array來(lái)實(shí)現(xiàn)的。

總結(jié)

遍歷在我們?nèi)粘i_(kāi)發(fā)中十分常見(jiàn),根據(jù)應(yīng)用場(chǎng)景,選擇合適的遍歷方法才是我們需要關(guān)系的。這篇文章總結(jié)了下遍歷的種類和注意事項(xiàng),希望能幫助到有需要的同學(xué)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談WKWebView 在64位設(shè)備上的白屏問(wèn)題

    淺談WKWebView 在64位設(shè)備上的白屏問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談WKWebView 在64位設(shè)備上的白屏問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • iOS實(shí)現(xiàn)攝像頭實(shí)時(shí)采集圖像

    iOS實(shí)現(xiàn)攝像頭實(shí)時(shí)采集圖像

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)攝像頭實(shí)時(shí)采集圖像,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • iOS按比例實(shí)現(xiàn)方塊圖

    iOS按比例實(shí)現(xiàn)方塊圖

    這篇文章主要為大家詳細(xì)介紹了iOS按比例實(shí)現(xiàn)方塊圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Objective-C的入門學(xué)習(xí)筆記

    Objective-C的入門學(xué)習(xí)筆記

    Objective-C過(guò)去一直以來(lái)都是iOS應(yīng)用程序開(kāi)發(fā)的主要支持語(yǔ)言,雖然現(xiàn)在有了Swift,但需要調(diào)用的很多現(xiàn)有類庫(kù)還是Objective-C寫成的,值得學(xué)習(xí),下面一起來(lái)看一下這份粗淺的Objective-C的入門學(xué)習(xí)筆記:
    2016-05-05
  • iOS實(shí)現(xiàn)九宮格自動(dòng)生成視圖

    iOS實(shí)現(xiàn)九宮格自動(dòng)生成視圖

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)九宮格自動(dòng)生成視圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • iOS實(shí)現(xiàn)圓角箭頭矩形的提示框

    iOS實(shí)現(xiàn)圓角箭頭矩形的提示框

    不知道大家發(fā)現(xiàn)了沒(méi),在現(xiàn)在的很多App中常使用圓角箭頭矩形, 如微博分組提示框, 地圖坐標(biāo)顯示點(diǎn)等。iPad 中有 UIPopoverController 類供開(kāi)發(fā)使用, iPhone中就需要開(kāi)發(fā)人員定制了。那么下面這篇文中就來(lái)聊聊定制圓角箭頭矩形提示框,有需要的朋友們可以參考借鑒。
    2016-11-11
  • iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)迭代器模式的使用示例

    iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)迭代器模式的使用示例

    這篇文章主要介紹了iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)迭代器模式的使用示例,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-03-03
  • Swift和Objective-C 混編注意事項(xiàng)

    Swift和Objective-C 混編注意事項(xiàng)

    這篇文章主要介紹了Swift和Objective-C 混編注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • iOS開(kāi)發(fā)中Quartz2D控制圓形縮放和實(shí)現(xiàn)刷幀效果

    iOS開(kāi)發(fā)中Quartz2D控制圓形縮放和實(shí)現(xiàn)刷幀效果

    這篇文章主要介紹了iOS開(kāi)發(fā)中Quartz2D控制圓形縮放和實(shí)現(xiàn)刷幀效果的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-12-12
  • 零基礎(chǔ)學(xué)習(xí)iOS直播之采集

    零基礎(chǔ)學(xué)習(xí)iOS直播之采集

    直播的采集由采集的設(shè)備(攝像頭、話筒)不同分為視頻采集和音頻采集,本篇文章會(huì)分別介紹,需要的朋友一起來(lái)看下吧
    2016-12-12

最新評(píng)論

宁强县| 阳泉市| 额济纳旗| 南岸区| 凯里市| 南昌市| 鹿邑县| 外汇| 海宁市| 德保县| 大厂| 集安市| 东至县| 乐安县| 边坝县| 道真| 乌海市| 清河县| 北辰区| 吴川市| 焦作市| 依安县| 昌平区| 家居| 彭州市| 芜湖市| 绥中县| 凤翔县| 永平县| 蓝山县| 乌海市| 修文县| 云和县| 南皮县| 卫辉市| 廊坊市| 治县。| 库尔勒市| 读书| 永新县| 文成县|