欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年03月30日 17:20:50   作者:卡卡羅特  
這篇文章主要介紹了設(shè)計模式中的迭代器模式在Cocoa Touch框架中的使用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下

基本理解
迭代器模式(Iterrator):提供一個方法順序訪問一個聚合對象中的各個元素,而又不暴露該元素的內(nèi)部表示。
當(dāng)你訪問一個聚合對象,而且不管這些對象是什么都需要遍歷的時候,你就應(yīng)該考慮用迭代器模式。
你需要對聚集有多種方式遍歷時,可以考慮用迭代器模式。
迭代器模式就是分離了集合對象的遍歷行為,抽象出一個迭代器類來負(fù)責(zé),這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu),又可讓外部代碼透明地訪問集合內(nèi)部的數(shù)據(jù)。
迭代器定義了一個用于訪問集合元素并記錄當(dāng)前元素的接口。
不同的迭代器可以執(zhí)行不同的迭代策略。
外部迭代器和內(nèi)部迭代器:

外部迭代器

  • 外部迭代器讓客戶端直接操作迭代過程,所以客戶端需要知道外部迭代器才能使用。但是它為客戶端提供了更多的控制
  • 客戶端創(chuàng)建并維護(hù)外部迭代器
  • 客戶端可以使用不同外部迭代器實(shí)現(xiàn)多種類型的遍歷

內(nèi)部迭代器

  • 客戶端不需要知道任何外部迭代器,而是可以通過集合對象的特殊接口,或者一次訪問一個元素,或者向集合中的每個元素發(fā)送消息。
  • 集合對象本身創(chuàng)建并維護(hù)它的外部迭代器
  • 集合對象可以在不修改客戶端代碼的情況下,選擇不同的外部迭代器

在Cocoa Touch框架中使用迭代器模式?

    基礎(chǔ)框架中的NSEnumerator類實(shí)現(xiàn)了迭代器模式。抽象NSEnumerator類的私有具體子類返回枚舉器對象,能夠順序遍歷各種集合——數(shù)組、集合、字典,把集合中的對象返回給客戶端。

    NSDirectoryEnumerator,這個類的實(shí)例遞歸枚舉文件系統(tǒng)中一個目錄的內(nèi)容。NSArray、NSSet、NSDictionary這樣的集合類,定義了返回與集合類型相應(yīng)的NSEnumerator子類實(shí)例的方法。所有的枚舉器都以同樣的方式工作,可以在一個循環(huán)中向枚舉器發(fā)送nextObject消息,從枚舉器取得對象,直到它返回nil表示遍歷結(jié)束。
1.NSEnumerator

    我們可以使用NSEnumerator來枚舉NSArray、NSDictionary和NSSet對象中的元素。NSEnumerator本身是個抽象類,它有依靠幾個工廠方法,如objectEnumrator或keyEnumerator,來創(chuàng)建并返回相應(yīng)的具體枚舉器對象。代碼如下:

復(fù)制代碼 代碼如下:

 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對數(shù)組進(jìn)行遍歷,當(dāng)消息調(diào)用[itemEnumerator nextObject]會返回nil,然后枚舉過程就結(jié)束了。

2.基于塊的枚舉

    從iOS4.0后,在NSArray、NSDictionary和NSSet對象中引入了新方法,用于基于塊的枚舉。其中一個方法叫enumerateObjectsUsingBlock:(void(^)(id obj, NSUInteger idx, BOOL *stop))block。我們可以把自己的算法定義在內(nèi)嵌到消息調(diào)用之中的塊里,或者在別的什么地方預(yù)定義一個塊,然后作為參數(shù)傳給消息調(diào)用。如下代碼:

復(fù)制代碼 代碼如下:

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數(shù)組中有字符串"李四",那么久把指針*stop設(shè)置為YES,以通知array對象提前停止遍歷。

    NSSet對象中基于塊的枚舉與NSArray中的非常類似,只是在塊的參數(shù)中沒有idx參數(shù)。因?yàn)榧现械脑厥菬o序的。

    使用NSArray、NSDictionary和NSSet的內(nèi)部迭代器的一個重要好處是,處理其內(nèi)容的算法可以在其他地方由其他開發(fā)人員來定義。與傳統(tǒng)的for循環(huán)中定義的算法不同,定義清晰的塊可以被復(fù)用。當(dāng)塊逐漸變大時,可把它們放到單獨(dú)的實(shí)現(xiàn)文件中,不跟其他代碼擠在一起。

3.快速枚舉

    從iOS2.0后提供了一種枚舉,快速枚舉,也是蘋果推薦的枚舉方法。它允許把集合對象的枚舉直接用作for循環(huán)的一部分,無需使用其他枚舉對象,而且比傳統(tǒng)的機(jī)遇索引的for循環(huán)效率更高。現(xiàn)在枚舉循環(huán)使用指針運(yùn)算,讓它比使用NSEnumerator的標(biāo)準(zhǔn)方法效率更高。

    要使用快速枚舉,集合類需要實(shí)現(xiàn)NSFastEnumeration協(xié)議,以向運(yùn)行庫提供關(guān)于集合的必要信息?;A(chǔ)框架中的所有集合類與NSEnumerator類都支持快速枚舉。因此不必使用while循環(huán)從NSEnumerator枚舉每個元素,直到nextObject返回nil。代碼如下:

復(fù)制代碼 代碼如下:

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.內(nèi)部枚舉

    NSArray有個實(shí)例方法叫(void)makeObjectsPerformSelector:(SEL)aSelector,它允許客戶端向數(shù)組中每個元素發(fā)送一個消息,讓每個元素執(zhí)行指定的aSelector??梢杂们懊嫣岬降娜魏我环N枚舉方法讓每個元素執(zhí)行相同的選擇器,達(dá)到相同的目的。這個方法在內(nèi)部枚舉集合并向每個元素發(fā)送performSelector:消息。這種方式的缺點(diǎn)是如果集合中任何元素不響應(yīng)選擇器,就會拋出異常。因此它主要使用于不需要太多運(yùn)行時檢查的簡單操作。

相關(guān)文章

  • iOS NSNotificationCenter通知中心使用小結(jié)

    iOS NSNotificationCenter通知中心使用小結(jié)

    IOS中經(jīng)常會使用到NSNotification和delegate來進(jìn)行一些類之間的消息傳遞,這篇文章主要介紹了iOS NSNotificationCenter使用小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • iOS獲取網(wǎng)絡(luò)類型的方法匯總

    iOS獲取網(wǎng)絡(luò)類型的方法匯總

    本篇文章主要給大家匯總介紹了iOS獲取網(wǎng)絡(luò)類型的方法,主要涉及到方面的內(nèi)容,對于IOS開發(fā)感興趣的同學(xué)可以參考一下
    2015-06-06
  • IOS開發(fā)用戶登錄注冊模塊所遇到的問題

    IOS開發(fā)用戶登錄注冊模塊所遇到的問題

    最近和另外一位同事負(fù)責(zé)公司登錄和用戶中心模塊的開發(fā)工作。通過本文給大家分享IOS開發(fā)用戶登錄注冊模塊所遇到的問題,感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • 推薦一個非常棒的Titanium MVC框架

    推薦一個非常棒的Titanium MVC框架

    ChariTi是一個非常不錯的Titanium MVC框架。此框架的特點(diǎn)是很多東西可直接通過配置文件實(shí)現(xiàn),如APP的主題顏色,每個tab的內(nèi)容,是否使用滑動菜單布局,是否支持tablet布局等,而且其對iOS 和 android也有很好的支持,同時也支持橫屏和豎屏的轉(zhuǎn)換然后使用不同的布局。
    2014-07-07
  • ios NSNotificationCenter通知的簡單使用

    ios NSNotificationCenter通知的簡單使用

    這篇文章主要介紹了ios NSNotificationCenter通知的簡單使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • iOS利用余弦函數(shù)實(shí)現(xiàn)卡片瀏覽工具

    iOS利用余弦函數(shù)實(shí)現(xiàn)卡片瀏覽工具

    這篇文章主要為大家詳細(xì)介紹了iOS利用余弦函數(shù)實(shí)現(xiàn)卡片瀏覽工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • IOS UITableViewCell詳解及按鈕點(diǎn)擊事件處理實(shí)例

    IOS UITableViewCell詳解及按鈕點(diǎn)擊事件處理實(shí)例

    這篇文章主要介紹了IOS UITableViewCell詳解及按鈕點(diǎn)擊事件處理實(shí)例的相關(guān)資料,這里附有示例代碼,大家可以看下如何實(shí)現(xiàn)按鍵點(diǎn)擊事件,需要的朋友可以參考下
    2016-12-12
  • iOS開發(fā)教程之XLForm的基本使用方法

    iOS開發(fā)教程之XLForm的基本使用方法

    XLForm 是最靈活且最強(qiáng)大的創(chuàng)建動態(tài)表單的iOS庫,下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之XLForm的基本使用方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • iOS開發(fā)中使用Quartz2D繪圖及自定義UIImageView控件

    iOS開發(fā)中使用Quartz2D繪圖及自定義UIImageView控件

    這篇文章主要介紹了iOS開發(fā)中使用Quartz2D繪圖及自定義UIImageView控件的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-11-11
  • IOS 中UIImageView響應(yīng)點(diǎn)擊事件

    IOS 中UIImageView響應(yīng)點(diǎn)擊事件

    這篇文章主要介紹了IOS 中UIImageView響應(yīng)點(diǎn)擊事件的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評論