Шаблоны программирования на Swift: Iterator
В этой статье мы разберем шаблон программирования Итератор (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)") }
—
extension NovellasCollection: SequenceType {
func generate() -> AnyGenerator {
var i = -1
return AnyGenerator {
i += 1
return i >= self.novellas.count ? nil : self.novellas[i]
}
}
}
Пишите более подробно а то ничего не понятно.