In this chapter, we will cover the following topics:
- Using closures to create self-contained code
 - Creating enumerations to write readable code
 - Working with protocols and delegates
 - Using extensions to extend classes functionality
 - Working with memory management and ARC
 - Using error handling
 - Using generics to write generic and reusable code