In this final chapter, we covered one of the most important aspects of innovation in the software world: sharing your code with the world. While anyone can upload a few lines of Swift to GitHub, publishing a successful project is a particular art form. As of now, you should be able to use Jazzy to generate beautiful HTML documentation of your code. Using GitHub, Travis, or even GitLab to host and iterate on your project is now second nature. For your iOS apps, you are able to refactor complex shell scripts into simple actions with fastlane. Finally, your repository isn't naked with just code, but sports a useful README, a license, and you, as a fresh maintainer, are ready to deal with your first issues, merge and close your first pull requests, and pledge to respect and appreciate your users.
Reflecting on what we covered through this book, we started with the first part of our journey laying out the foundation of knowledge required to tackle design patterns properly. You now have a great understanding of the Swift language, and how the compiler helps you manage memory automatically. Foundation, the standard library provides a great base set of tools to work on any Swift project, so you are able to recognize when to use those tools and choose them appropriately. Lastly in this first arch, we covered how to mix Swift and Objective-C.
The second section was dedicated to the main design patterns you will encounter in Swift, based on the Gang of Four's patterns, and we have covered most of them. You also learned how to use Sourcery, a code generation tool for patterns that require more boilerplate. All the patterns we covered are ready to use and I hope you'll always use this work as a reference when refactoring existing code or extending your projects. We ventured in some swift specific patterns that you will encounter in many projects. We made a quick foray into architectural patterns and now, you should be able to write better MVC and switch when necessary to MVVM. Lastly, we covered dependency injection as well as futures and promises as those two concepts are used by many libraries and help write cleaner programs.
The last act was dedicated to additional skills and advanced techniques you will employ during your journey as a programmer. Covering using and creating packages, testing and open sourcing, this last section is designed as an extension to this book. You can most probably universally apply the concepts discussed to all programming languages as the practices described fall under the best practices. Applying the divide and conquer strategy, splitting your project into independent modules, creating unit and integration tests, and running them periodically on continuous integration services is always a sign of a healthy code base.