 let someone = Person(firstName: "Shayleen")
 
 //: So what happens when we try to change the person's name:
+
+let anotherPerson = someone
 someone.firstName = "Katerina"
 // someone.lastName = "SemiSerious"
 someone.printName()
+
+anotherPerson.printName()
 
 //: ##### Hey! someone has been declared as a constant but we can change their name.
 


print(theString)

//: ##### I would recommend that you always prefer let over var.

//: ### What is the difference between instances of Structs and Classes?


if let aString = optionalString {
    print(aString)
}

//: In Swift 2 you can also unwrap the optional using guard let.
//: You can't use guard at the top level of a playground.

func printOptional(optionalString optionalString: String?) -> Void {
    guard let unwrappedString = optionalString else {
        print("optionalString is Optional.None \(optionalString)")
        return
    }
    
    print(unwrappedString)
}

printOptional(optionalString: optionalString)
// printOptional(optionalString: .None)

//: After an optional value has been assigned a value you can set it back to nil.

