Шаблоны программирования на Swift: Iterator

iterator-preSwift_ru

 

В этой статье мы разберем шаблон программирования Итератор (Iterator) на языке программирования Swift в среде разработки Xcode.

 

Iterator

В книге даны уж больно замудренные примеры, но это обусловленно особенностями языка Objective-C. На Swift пример занимает в разы меньше.

Так что для начала пример из жизни:

И как показывает практика, самый простой пример – это обычная вендинг машина. (сам пример взят из книги Pro Objective-C Design Patterns for iOS). У нас есть контейнер, который разделен на секции, каждая из которых содержит определенный вид товара, к примеру набор бутылок Coca-Cola. Когда мы заказываем товар, то нам выпадет следующий из колекции. Образно говоря, команда cocaColaCollection.next

Паттерн итератор позволяет последовательно обращаться к колекции объектов, не особо вникая что же это за коллекция.

Самый простой пример перебора выгляди так:

//
// proSwift.ru
//

let array = ["Яблоки", "Персики", "Сливы"]

for (index, item) in array.enumerate() {
	print("Нашли \(item) на позиции \(index)")
}

Консоль:

Нашли Яблоки на позиции 0
Нашли Персики на позиции 1
Нашли Сливы на позиции 2

По сути, шаблон Итератор используется для обеспечения стандартного интерфейса для обхода набора элементов без необходимости понять структуру этого набора.

Пример с GitHub создает структуру с коллекцией элементов произвольного типа и добавляет возможность перебора элементов в данной структуре.

//
// proSwift.ru
//
// https://github.com/ochococo/Design-Patterns-In-Swift/blob/master/source/behavioral/iterator.swift

struct NovellasCollection<T> {
    let novellas: [T]
}

extension NovellasCollection: SequenceType {
    func generate() -> AnyGenerator<T> {
        var i = 0
        return AnyGenerator {
            i += 1
            return i >= self.novellas.count ? nil : self.novellas[i]
        }
    }
}

let greatNovellas = NovellasCollection(novellas:["Mist", "Quest", "Horror"])

for novella in greatNovellas {
    print("I've read: \(novella)")
}

2 Comments on “Шаблоны программирования на Swift: Iterator

  1. extension NovellasCollection: SequenceType {
    func generate() -> AnyGenerator {
    var i = -1
    return AnyGenerator {
    i += 1
    return i >= self.novellas.count ? nil : self.novellas[i]
    }
    }
    }

Добавить комментарий для Олег Отменить ответ

Ваш адрес email не будет опубликован.

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.