I. Introduction:
Iterator is a Design Pattern of the Behavior type. It allows us to browse the elements of a collection without revealing its detailed implementations. Iterator Pattern consists of the following components:
IterableProtocol
in Swift defines a data type that allows access to elements through thefor
loop.- Iterator Object : Object is customized so that data can be accessed in a loop .
II. How it works:
Iterator Pattern provides a sequential way to access elements of a collection . The way we access this will be determined by the data structure of the collection . Data structure can be Array, Tree, … At the same time, its data access method will be concealed and not exposed to the outside.
III. When is the pattern iterator used?
Iterator Pattern is used when there is a class or structure containing a group of objects that are arranged and want to access elements using the for
loop.
IV. For example:
To make it easier to access and understand, we will use the Queue data structure as an example of the Iterator Pattern . The Queue in the example will act as the Iterator Object .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">public</span> <span class="token keyword">struct</span> <span class="token builtin">Queue</span> <span class="token operator"><</span> T <span class="token operator">></span> <span class="token punctuation">{</span> fileprivate <span class="token keyword">var</span> array <span class="token operator">=</span> <span class="token punctuation">[</span> T <span class="token punctuation">]</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token keyword">var</span> <span class="token builtin">isEmpty</span> <span class="token punctuation">:</span> <span class="token builtin">Bool</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> array <span class="token punctuation">.</span> <span class="token builtin">isEmpty</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">var</span> <span class="token builtin">count</span> <span class="token punctuation">:</span> <span class="token builtin">Int</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> array <span class="token punctuation">.</span> <span class="token builtin">count</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">mutating</span> <span class="token keyword">func</span> <span class="token function">enqueue</span> <span class="token punctuation">(</span> <span class="token number">_</span> element <span class="token punctuation">:</span> T <span class="token punctuation">)</span> <span class="token punctuation">{</span> array <span class="token punctuation">.</span> <span class="token function">append</span> <span class="token punctuation">(</span> element <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">mutating</span> <span class="token keyword">func</span> <span class="token function">dequeue</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> T <span class="token operator">?</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token builtin">isEmpty</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant">nil</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> array <span class="token punctuation">.</span> <span class="token function">removeFirst</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Implement adopt Sequence
protocol to convert Queue to Iterator form.
1 2 3 4 5 6 | <span class="token keyword">extension</span> <span class="token builtin">Queue</span> <span class="token punctuation">:</span> <span class="token builtin">Sequence</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">func</span> <span class="token function">makeIterator</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">IndexingIterator</span> <span class="token operator"><</span> <span class="token punctuation">[</span> T <span class="token punctuation">]</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> array <span class="token punctuation">.</span> <span class="token function">makeIterator</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Add elements to Queue .
1 2 3 4 5 | <span class="token keyword">var</span> queue <span class="token operator">=</span> <span class="token builtin">Queue</span> <span class="token operator"><</span> <span class="token builtin">String</span> <span class="token operator">></span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> queue <span class="token punctuation">.</span> <span class="token function">enqueue</span> <span class="token punctuation">(</span> <span class="token string">"Element 1"</span> <span class="token punctuation">)</span> queue <span class="token punctuation">.</span> <span class="token function">enqueue</span> <span class="token punctuation">(</span> <span class="token string">"Element 2"</span> <span class="token punctuation">)</span> queue <span class="token punctuation">.</span> <span class="token function">enqueue</span> <span class="token punctuation">(</span> <span class="token string">"Element 3"</span> <span class="token punctuation">)</span> |
Retrieve element in Queue
1 2 3 4 | <span class="token keyword">for</span> element <span class="token keyword">in</span> queue <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> element <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
V. References:
- Design Pattern by Tutorials – Raywenderlich
- State Pattern by refactoring.guru