亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

設計模式中的迭代器模式在Cocoa Touch框架中的使用

2020-07-26 03:24:02
字體:
來源:轉載
供稿:網友

基本理解
迭代器模式(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循環效率更高?,F在枚舉循環使用指針運算,讓它比使用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??梢杂们懊嫣岬降娜魏我环N枚舉方法讓每個元素執行相同的選擇器,達到相同的目的。這個方法在內部枚舉集合并向每個元素發送performSelector:消息。這種方式的缺點是如果集合中任何元素不響應選擇器,就會拋出異常。因此它主要使用于不需要太多運行時檢查的簡單操作。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久亚洲精品中文字幕| 欧美性色19p| 国产精品高潮呻吟久久av黑人| 日韩成人在线视频网站| 91精品国产综合久久男男| 国产欧美精品久久久| 91精品国产一区| 国产精品免费观看在线| 69久久夜色精品国产7777| 福利微拍一区二区| 久久久久久久久国产精品| 国产欧美一区二区三区四区| 国产精品狼人色视频一区| 久久好看免费视频| 成人免费看片视频| 51午夜精品视频| 久久久日本电影| 成人黄色片网站| 欧洲日本亚洲国产区| 久久久精品电影| 国产999精品| 色综合影院在线| 在线观看91久久久久久| 色噜噜久久综合伊人一本| 色婷婷综合成人av| 欧美午夜精品伦理| 色综合老司机第九色激情| 日韩电视剧免费观看网站| 欧美日韩在线免费| 免费91麻豆精品国产自产在线观看| 日韩中文字幕在线视频| 国产精品扒开腿做| 伦伦影院午夜日韩欧美限制| 欧美成人网在线| 久久精品欧美视频| 色一区av在线| 欧美成人免费小视频| 欧美天天综合色影久久精品| 久久精品夜夜夜夜夜久久| 亚洲国产精品va在线| 欧美一区二区三区……| 日本在线观看天堂男亚洲| 九九热这里只有在线精品视| 自拍亚洲一区欧美另类| 成人久久一区二区| 色偷偷噜噜噜亚洲男人| 国产一区二区三区在线| 国内揄拍国内精品| 欧美日韩在线观看视频| 中文字幕在线成人| 亚洲日韩欧美视频一区| 久久久久日韩精品久久久男男| 免费91在线视频| 久久久久久18| 成人国产在线视频| 欧美极品xxxx| 97香蕉久久超级碰碰高清版| 91国内在线视频| 欧美激情一级欧美精品| 成人精品久久av网站| 欧美夫妻性生活视频| 国产视频一区在线| 久久精品国产久精国产一老狼| 国产亚洲精品日韩| 亚洲精品在线91| 久久精品成人动漫| 亚洲精品国产精品乱码不99按摩| 日韩精品免费看| 亚洲视频国产视频| 青青草精品毛片| 国产美女直播视频一区| 在线不卡国产精品| 日韩精品中文字幕在线播放| 日韩久久免费视频| 亚洲最大av网站| 色婷婷综合久久久久中文字幕1| 精品调教chinesegay| 欧美成人剧情片在线观看| 午夜精品视频在线| 国产一区二区三区高清在线观看| 亚洲精品国产品国语在线| 久久免费视频观看| 欧美人成在线视频| 日韩精品中文字幕有码专区| 亚洲精品视频中文字幕| 在线一区二区日韩| 日韩福利视频在线观看| 亚洲精品免费一区二区三区| 久久久在线免费观看| 亚洲开心激情网| 5278欧美一区二区三区| 欧美孕妇与黑人孕交| 亚洲欧洲视频在线| 国产美女扒开尿口久久久| 国产精品对白刺激| 日韩欧美a级成人黄色| 91精品免费久久久久久久久| 欧美精品做受xxx性少妇| 成人免费在线视频网站| 伊人久久久久久久久久| 日韩经典第一页| 亚洲一区二区三区香蕉| 日韩精品中文字幕在线播放| 国产精品一区二区av影院萌芽| 国产做受高潮69| 色婷婷**av毛片一区| 中国china体内裑精亚洲片| 精品人伦一区二区三区蜜桃免费| 精品国产乱码久久久久久婷婷| 国产精品视频久久久久| 欧美国产精品va在线观看| 成人激情视频免费在线| 亚洲欧美国产日韩天堂区| 欧美高清videos高潮hd| 国产成人福利夜色影视| 欧美激情久久久久久| 亚洲二区在线播放视频| 午夜美女久久久久爽久久| 日韩精品在线免费播放| 色偷偷av一区二区三区乱| 欧美成人精品激情在线观看| 久久久久亚洲精品国产| 国产美女被下药99| 在线观看日韩欧美| 国产精品99久久久久久久久久久久| 久久婷婷国产麻豆91天堂| 亚洲精品v欧美精品v日韩精品| 日韩免费av一区二区| 日韩欧美亚洲范冰冰与中字| 亚洲2020天天堂在线观看| 亚洲第一在线视频| 在线播放国产一区二区三区| 国产aaa精品| 青青草一区二区| 亚洲一区二区三区视频播放| 久久在线精品视频| 国产69精品久久久久久| 成人免费网站在线| 国产成人精品网站| 69av成年福利视频| 国产一区在线播放| 国产综合在线看| 成人久久一区二区| 91亚洲国产成人久久精品网站| 91沈先生作品| 日韩久久免费视频| 亚洲国产天堂久久综合| 日韩av在线免费看| 亚洲iv一区二区三区| 亚洲欧洲一区二区三区在线观看| 国产精品自产拍在线观看中文| 日韩免费看的电影电视剧大全| 7777免费精品视频| 性欧美暴力猛交69hd| 日本不卡视频在线播放| 国产97免费视| 亚洲福利视频网| 91在线观看免费高清完整版在线观看| 久久国产精品久久久久| 欧美午夜女人视频在线| 日韩av电影国产| 精品亚洲国产视频| 亚洲第一在线视频| 久久这里只有精品99|