一、介紹
迭代器:提供一種方法順序訪問乙個聚合物件中的各個元素,而不需要暴露該物件的內部表示.(遍歷集合中元素的只能從集合本身轉移到迭代器物件。迭代器定義了乙個用於訪問集合元素並記錄當前元素的介面。不同的迭代器可以執行不同的遍歷策略。提供一種方法順序訪問乙個聚合物件中得各個元素,而又不需暴露該物件的內部表示。)
分類 外部迭代器:讓客戶端直接操作迭代過程,所以客戶端需要知道外部迭代器才能使用。
內部迭代器:集合物件(被迭代的目標物件)在其內部維護並操作乙個外部迭代器。提供內部迭代器的典型的集合物件為客戶端定義乙個介面,或者從底層的集合一次訪問乙個元素,或者向每個元素傳送訊息。
何時使用: (1)需要訪問組合物件的內容,又不想暴露其內部表示
(2)需要使用多種方式遍歷組合物件
(3)需要提供統一的介面來遍歷各種型別的組合物件
關係圖
二、在cocoa touch框架中使用迭代器模式
基礎框架中的nsenumerator類實現了迭代器模式。抽象nsenumerator類的私有具體子類返回列舉器物件,能夠順序遍歷各種集合——陣列、集合、字典,把集合中的物件返回給客戶端。
1.nsenumerator
我們可以使用nsenumerator來列舉nsarray、nsdictionary和nsset物件中的元素。nsenumerator本身是個抽象類,它有依靠幾個工廠方法,如objectenumrator或keyenumerator,來建立並返回相應的具體列舉器物件。 使用nsenumerator對陣列進行遍歷,當呼叫[itemenumerator nextobject]會返回nil,然後列舉過程就結束了。
**如下:
nsarray *array = @[@"小麗", @"李明", @"王子"];
nsenumerator *itemenumerator = [array objectenumerator];
nsstring *item;
while (item = [itemenumerator nextobject])
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 :王子
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)
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)
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:訊息。這種方式的缺點是如果集合中任何元素不響應選擇器,就會丟擲異常。因此它主要使用於不需要太多執行時檢查的簡單操作。
iOS設計模式 七 迭代器模式
迭代器提供了一種順序訪問聚合物件 集合 中元素的方法,而無需暴露結構的低層表示和細節。遍歷集合中元素的職能從集合本身轉移到迭代器物件。迭代器定義了乙個用於訪問集合元素並記錄當前元素的介面。不同的迭代器可以執行不同的遍歷策略。下面就是一種系統自帶的迭代器模式。nsarray array 1,2,3 n...
IOS設計模式學習(14)迭代器
1 前言 在物件導向中,針對抽象集合迭代行為的設計模式稱為迭代器。2 詳述 2.1 簡述 迭代器提供了一種順序訪問聚合物件 集合 中元素的方法,而無需暴露結構的底層表示和細節。便利集合中元素的只能從集合本身轉移到迭代器物件。迭代器定義了乙個用於訪問集合元素並記錄當前元素的介面。不同的迭代器可以執行不...
設計模式 迭代器模式
迭代器模式是屬於物件行為性的模式。首先是定義 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露物件的表示方法。迭代器的結構圖 適用性 1 訪問乙個聚合物件的內容而無需暴露它的內部表示 2 支援聚合物件的多種遍歷 3 為遍歷不同的聚合結構提供乙個統一的介面 支援多型迭代 協作 concretei...