         closure(cat: cats[index])
     }
 }
-
+/*:
+ - example: Calling the interator functions for dog and cat.
+ */
 iteratorDogs(dogs) { (dog) in
     
     print("\(dog.name) makes a \(dog.makeSound()) sound.")

        return ""
    }
}
class Dog: Animal, SoundMaker {

    override func makeSound() -> String {
        return "bark"
    }
}

class Cat: Animal, SoundMaker {

    override func makeSound() -> String {
        return "meow"
    }
}

let dogs = [Dog(name: "Fido"), Dog(name: "Spot")]

let cats = [Cat(name: "Snowy"), Cat(name: "Snuffles")]

func iteratorDogs(dogs: [Dog], closure: (dog: Dog) -> Void) {
    
    for index in 0..<dogs.count {

 [Table of Contents](@first) | [Previous](@previous) | [Next](@next)
 - - -
 # Generics
 * callout(Session Overview): In the real world we can externalized patterns in to a construct that resembles something generically. Applying this type of thinking in everyday objects produces templates that we can use immediately and fill in the placeholders the pieces that are specific. Swift uses *generics* as a way to create types that are not specific and can be applied to other types but leverage the implementation in the generic.
 */
import Foundation
/*:
 ## Our Types
 Consider the following types that we will be using in our program for building a Kennel tracking system that tracks all types of animals, not just dogs and cats.
 */
protocol SoundMaker {
    
    func makeSound() -> String
}
class Animal: SoundMaker {
    
    var name: String
    init(name: String) {
