iOS中如何實(shí)現(xiàn)遍歷-創(chuàng)新互聯(lián)

小編給大家分享一下iOS中如何實(shí)現(xiàn)遍歷,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),新林企業(yè)網(wǎng)站建設(shè),新林品牌網(wǎng)站建設(shè),網(wǎng)站定制,新林網(wǎng)站建設(shè)報(bào)價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,新林網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

在iOS開發(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ù)組

遍歷過程中是不能隨便刪除遍歷的元素的,如果需要刪除元素,可以先復(fù)制一份出來,比如如下的代碼會有問題:

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中會保存變量的值,而不會隨變量的值的改變而改變 。

遍歷的速率

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

遍歷實(shí)踐tips

數(shù)組分組

在開發(fā)中,有時需要對數(shù)組進(jìn)行某種情況的分組,比如,一個擁有很多消息模型的數(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ù)組的過濾方法得到新的數(shù)組,在添加的最終的數(shù)組
}

倒序遍歷

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

set排序

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

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

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

以上是“iOS中如何實(shí)現(xiàn)遍歷”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站欄目:iOS中如何實(shí)現(xiàn)遍歷-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://muchs.cn/article24/dcpdje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、域名注冊、網(wǎng)站設(shè)計(jì)、網(wǎng)站排名、網(wǎng)頁設(shè)計(jì)公司、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化