рд╕реНрд╡рд┐рдлреНрдЯ рдпреВрдирд┐рд╡рд░реНрд╕ рдореЗрдВ Iterator рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдкреИрдЯрд░реНрди

"рдЗрдЯрд░реЗрдЯрд░" рдПрдХ рдРрд╕рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдХреНрд╕рд░ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реАрдзреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдирдХ рдЯреВрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ "рдЧрдВрдЧ рдСрдл рдлреЛрд░", "GoF", "рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди: рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рддрддреНрд╡" рдкреБрд╕реНрддрдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреИрдЯрд░реНрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдФрд░ рд╕рдордЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдХрд░рдг рдХрднреА рджрд░реНрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдорджрдж рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ "рдкреБрдирд░рд╛рд╡реГрддреНрдд" рдПрдХ рд╕рдордЧреНрд░ рд╡рд╕реНрддреБ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╕рд░рдгреА рдпрд╛ рд╕реЗрдЯ) рдХреЗ рдХреНрд░рдорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред

рдорд╛рдирдХ рднрд╛рд╖рд╛ рдЙрдкрдХрд░рдг


рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд░рдгреА рдмрдирд╛рдПрдБ:

let numbersArray = [0, 1, 2] 

... рдФрд░ рдлрд┐рд░ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдЪрд▓рдирд╛":

 for number in numbersArray { print(number) } 

... рдПрдХ рдмрд╣реБрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ рдЬреИрд╕реА рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреЛрдб рд╣реИ рдЬреЛ Iterator рдкреИрдЯрд░реНрди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

"рд╕реНрд╡рд┐рдлреНрдЯ" рдореЗрдВ, рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ for рдПрдХ рдЪрд░ рдХреЛ "рдкреБрдирд░рд╛рд╡реГрддрд┐" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ for , рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ Sequence рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ associatedtype Iterator рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ IteratorProtocol рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рдзрд┐ makeIterator() рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ " makeIterator() " рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 protocol Sequence { associatedtype Iterator : IteratorProtocol func makeIterator() -> Self.Iterator // Another requirements go hereтАж } 

IteratorProtocol рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдмрджрд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ - next() , рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓рд╛ рддрддреНрд╡ рджреЗрддрд╛ рд╣реИ:

 protocol IteratorProtocol { associatedtype Element mutating func next() -> Self.Element? } 

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХреЛрдб рд╣реИ," рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдиреАрдЪреЗ рд╣рдо рдЗрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред

Array рдкреНрд░рдХрд╛рд░ Sequence рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реАрдзреЗ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ: MutableCollection Collection рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз Sequence рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЪрдХреНрд░ рдХреЗ for "iterated" рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░


рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рдкреБрд╕реНрддрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ:

 struct Book { let author: String let title: String } struct Shelf { var books: [Book] } 

Shelf рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг "рдкреБрдирд░рд╛рд╡реГрддрд┐" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ Sequence рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ makeIterator() рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪреВрдВрдХрд┐ рдЕрдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИ ред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ IteratorProtocol рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдХрдо рд╕рд░рд▓ рдХреЛрдб рд╣реИ:

 struct ShelfIterator: IteratorProtocol { private var books: [Book] init(books: [Book]) { self.books = books } mutating func next() -> Book? { // TODO: Return next underlying Book element. } } extension Shelf: Sequence { func makeIterator() -> ShelfIterator { return ShelfIterator(books: books) } } 

ShelfIterator рдкреНрд░рдХрд╛рд░ рдХреА next() рд╡рд┐рдзрд┐ рдХреЛ mutating рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ ShelfIterator , рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

 mutating func next() -> Book? { defer { if !books.isEmpty { books.removeFirst() } } return books.first } 

рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрд╢рд╛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЕрдиреБрдХреНрд░рдо рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдкрд░ nil рдХрд░рддрд╛ рд╣реИред defer рдмреНрд▓реЙрдХ defer рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рд╕рд╛рде "рд▓рдкреЗрдЯрд╛" рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдзрд┐ рд░рд┐рдЯрд░реНрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЕрдВрддрд┐рдо рдЪрд▓рдирд╛ рдХрджрдо рдХреЗ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 let book1 = Book(author: ". ", title: "") let book2 = Book(author: ". ", title: " ") let book3 = Book(author: ". ", title: " ") let shelf = Shelf(books: [book1, book2, book3]) for book in shelf { print("\(book.author) тАУ \(book.title)") } /* .  тАУ  .  тАУ   .  тАУ   */ 

рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ ( Array рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд Shelf рд╕рд╣рд┐рдд) рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ (рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд) , рдЖрдкрдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рджреМрд░рд╛рди рдореВрд▓ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд▓рд┐рдВрдХ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╕рдордп, рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛


"рдЧреИрдВрдЧреНрд╕ рдСрдлрд╝ рдлреЛрд░" рдкреБрд╕реНрддрдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреНрд▓рд╛рд╕рд┐рдХ "рдЗрдЯреЗрд░реЗрдЯрд░", рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рднреА рд╕рдордп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкреБрдирд░рд╛рд╡реГрддреНрдд рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдФрд░ "рдзреНрд╡рдЬ" рдХрд╛ рдореВрд▓реНрдп рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрднреА рднреА рд╣реИрдВ рдореМрдЬреВрджрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрджрдо рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рддрддреНрд╡ред

рдмреЗрд╢рдХ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдорд╛рдирдХ IteratorProtocol рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

 protocol ClassicIteratorProtocol: IteratorProtocol { var currentItem: Element? { get } var first: Element? { get } var isDone: Bool { get } } 

рдкрд╣рд▓рд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рддрдм рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ рд╕реНрд░реЛрдд рдЕрдиреБрдХреНрд░рдо рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк:

 struct ShelfIterator: ClassicIteratorProtocol { var currentItem: Book? = nil var first: Book? var isDone: Bool = false private var books: [Book] init(books: [Book]) { self.books = books first = books.first currentItem = books.first } mutating func next() -> Book? { currentItem = books.first books.removeFirst() isDone = books.isEmpty return books.first } } 

рдкреИрдЯрд░реНрди рдХреЗ рдореВрд▓ рд╡рд┐рд╡рд░рдг рдореЗрдВ, next() рд╡рд┐рдзрд┐ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП currentElement() рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ Void , рдФрд░ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ currentElement() рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред IteratorProtocol рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ, рдпреЗ рджреЛ рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

first() рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдореВрд▓ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ,) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред

рдФрд░, рдЪреВрдВрдХрд┐ next() рд╡рд┐рдзрд┐ nil рдЬрдм рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ isDone() рд╡рд┐рдзрд┐ рднреА рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢реИрдХреНрд╖рдгрд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

 func printShelf(with iterator: inout ShelfIterator) { var bookIndex = 0 while !iterator.isDone { bookIndex += 1 print("\(bookIndex). \(iterator.currentItem!.author) тАУ \(iterator.currentItem!.title)") _ = iterator.next() } } var iterator = ShelfIterator(books: shelf.books) printShelf(with: &iterator) /* 1. .  тАУ  2. .  тАУ   3. .  тАУ   */ 

iterator рдкреИрд░рд╛рдореАрдЯрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдФрд░ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдЯреНрд░реЗрдЯрд░ рдЙрджрд╛рд╣рд░рдг рд╕реАрдзреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред

next() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдпрд╣ рд╕рдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╛рд░ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╕рднреА рд╕реБрдВрджрд░ рдХреЛрдб рдФрд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛!

рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдкрд░ рдореЗрд░реЗ рдЕрдиреНрдп рд▓реЗрдЦ:

Source: https://habr.com/ru/post/hi437614/


All Articles