根本懂得
迭代器形式(Iterrator):供給一個辦法次序拜訪一個聚合對象中的各個元素,而又不裸露該元素的外部表現。
當你拜訪一個聚合對象,並且不論這些對象是甚麼都須要遍歷的時刻,你就應當斟酌用迭代器形式。
你須要對集合有多種方法遍用時,可以斟酌用迭代器形式。
迭代器形式就是分別了聚集對象的遍歷行動,籠統出一個迭代器類來擔任,如許既可以做到不裸露聚集的外部構造,又可以讓內部代碼通明地拜訪聚集外部的數據。
迭代器界說了一個用於拜訪聚集元素並記載以後元素的接口。
分歧的迭代器可以履行分歧的迭代戰略。
內部迭代器和外部迭代器:
內部迭代器
外部迭代器
在Cocoa Touch框架中應用迭代器形式?
基本框架中的NSEnumerator類完成了迭代器形式。籠統NSEnumerator類的公有詳細子類前往列舉器對象,可以或許次序遍歷各類聚集——數組、聚集、字典,把聚集中的對象前往給客戶端。
NSDirectoryEnumerator,這個類的實例遞歸列舉文件體系中一個目次的內容。NSArray、NSSet、NSDictionary如許的聚集類,界說了前往與聚集類型響應的NSEnumerator子類實例的辦法。一切的列舉器都以異樣的方法任務,可以在一個輪回中向列舉器發送nextObject新聞,從列舉器獲得對象,直到它前往nil表現遍歷停止。
1.NSEnumerator
我們可使用NSEnumerator來列舉NSArray、NSDictionary和NSSet對象中的元素。NSEnumerator自己是個籠統類,它有依附幾個工場辦法,如objectEnumrator或keyEnumerator,來創立並前往響應的詳細列舉器對象。代碼以下:
NSArray *array = @[@"張三", @"李四", @"王五"];
NSEnumerator *itemEnumerator = [array objectEnumerator];
NSString *item;
while (item = [itemEnumerator nextObject]) {
NSLog(@"item is :%@", item);
}
2015-08-28 16:48:05.463 NSEnumatroDemo[55301:3712762] item is :張三 2015-08-28 16:48:05.463 NSEnumatroDemo[55301:3712762] item is :李四 2015-08-28 16:48:05.464 NSEnumatroDemo[55301:3712762] item is :王五
應用NSEnumerator對數組停止遍歷,當新聞挪用[itemEnumerator nextObject]會前往nil,然後列舉進程就停止了。
2.基於塊的列舉
從IOS4.0後,在NSArray、NSDictionary和NSSet對象中引入了新辦法,用於基於塊的列舉。個中一個辦法叫enumerateObjectsUsingBlock:(void(^)(id obj, NSUInteger idx, BOOL *stop))block。我們可以把本身的算法界說在內嵌到新聞挪用當中的塊裡,或許在其余甚麼處所預界說一個塊,然後作為參數傳給新聞挪用。以下代碼:
NSArray *array = @[@"張三", @"李四", @"王五"];
NSString *str = @"李四";
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"item is :%@", obj);
if ([obj localizedStandardCompare:str] == NSOrderedSame) {
*stop = YES;
NSLog(@"停滯遍歷");
}
}];
2015-08-28 17:10:03.556 NSEnumatroDemo[55478:3723216] item is :張三 2015-08-28 17:10:03.557 NSEnumatroDemo[55478:3723216] item is :李四 2015-08-28 17:10:03.557 NSEnumatroDemo[55478:3723216] 停滯遍歷
假如array數組中有字符串"李四",那末久把指針*stop設置為YES,以告訴array對象提早停滯遍歷。
NSSet對象中基於塊的列舉與NSArray中的異常相似,只是在塊的參數中沒有idx參數。由於聚集中的元素是無序的。
應用NSArray、NSDictionary和NSSet的外部迭代器的一個主要利益是,處置其內容的算法可以在其他處所由其他開辟人員來界說。與傳統的for輪回中界說的算法分歧,界說清楚的塊可以被復用。當塊逐步變年夜時,可把它們放到零丁的完成文件中,不跟其他代碼擠在一路。
3.疾速列舉
從IOS2.0後供給了一種列舉,疾速列舉,也是蘋果推舉的列舉辦法。它許可把聚集對象的列舉直接用作for輪回的一部門,無需應用其他列舉對象,並且比傳統的機會索引的for輪回效力更高。如今列舉輪回應用指針運算,讓它比應用NSEnumerator的尺度辦法效力更高。
要應用疾速列舉,聚集類須要完成NSFastEnumeration協定,以向運轉庫供給關於聚集的需要信息。基本框架中的一切聚集類與NSEnumerator類都支撐疾速列舉。是以不用應用while輪回從NSEnumerator列舉每一個元素,直到nextObject前往nil。代碼以下:
NSArray *array = @[@"張三", @"李四", @"王五"];
for (id item in array) {
NSLog(@"item is :%@", item);
}
2015-08-28 17:28:18.619 NSEnumatroDemo[55596:3730966] item is :張三 2015-08-28 17:28:18.620 NSEnumatroDemo[55596:3730966] item is :李四 2015-08-28 17:28:18.620 NSEnumatroDemo[55596:3730966] item is :王五
4.外部列舉
NSArray有個實例辦法叫(void)makeObjectsPerformSelector:(SEL)aSelector,它許可客戶端向數組中每一個元素發送一個新聞,讓每一個元素履行指定的aSelector。可以用後面提到的任何一種列舉辦法讓每一個元素履行雷同的選擇器,到達雷同的目標。這個辦法在外部列舉聚集並向每一個元素發送performSelector:新聞。這類方法的缺陷是假如聚集中任何元素不呼應選擇器,就會拋出異常。是以它重要應用於不須要太多運轉時檢討的簡略操作。
【設計形式中的迭代器形式在Cocoa Touch框架中的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!