     }
 }
 /*:
+ - experiment: Delete the `convenience` keyword from the extension `Head`. What does the compiler tell you?
+ */
+/*:
  ## Adding Subscripts
- 
- - example: ADD
+ Extensions allow you to add new subscripts to existing types. Remember that subscripts enable you to access or mutate elements in a collection type. You can create subscripts as shortcuts for interacting with a type that contains a collection type internally and provide other subscript methods to interact with that internal collection type.
+ - example: Extension on `String` adding subscripts.\
+ Below we have added two new subscript methods; one to get a `Character` with subscript, and the other to get a substring with a start and end subscripts.
  */
 extension String {
 
+    subscript(index: Int) -> Character? {
+
+        // let's guard against invalid values
+        guard index >= 0 && index < length else {
+            return nil
+        }
+        
+        return Character(substringWithRange(startIndex.advancedBy(index)...startIndex.advancedBy(index)))
+    }
+    
     subscript(start: Int, add: Int) -> String? {
         
         // let's guard against invalid values
-        guard start >= 0 && start < (length - 1) && add >= 0 else {
+        guard start >= 0 && start < length && add >= 0 else {
             return nil
         }
 

}

let length = "I should be the length of 28".length

/*:
 ## Adding New Methods
 In similar fashion as adding new computed properties, you add new methods to an existing type by creating an extension and add the new methods. You are not able to override properties and methods.
 - example: ADD
 */
extension Double {


}

let test = "This is a test of the emergency broadcast system"

let emergency = test[22, 9]
let system = test[42, Int.max]

for var i in 0..<system!.length {

    print(system![i]!)

    i += 1
}
/*:
 ## Adding Nested Types
 Extensions give you the ability of adding nested types within other type. This could be useful to further expand on the static nature of the type your extending.
 - example: Extension adding a nested type to `Int`.\
 Below is an extension on `Int` adding a nested enumeration `Grade` and an instance computed property `grade`. An instance of `Int` can access the property `grade` to get the appropriate grade enumeration.
 */
extension Int {
    
