Further Reading

You should really check out the following:

SourceView sample code (Objective-C)
https://developer.apple.com/library/mac/samplecode/SourceView/Listings/BaseNode_m.html#//apple_ref/doc/uid/DTS10004441-BaseNode_m-DontLinkElementID_6
Example application by Apple where NSOutlineView is used. Good for getting started, although the example app doesn’t run properly anymore – I don’t see any images in the source view.
Clean Architecture
http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
http://blog.8thlight.com/uncle-bob/2011/11/22/Clean-Architecture.html
Uncle Bob’s explanation of the architectural concepts I tried to adhere to. Goes beyond Hex
Uncle Bob: Architecture – The Lost Years (Video)
https://www.youtube.com/watch?v=WpkDN78P884
This talk introduced me to Hexagonal and Clean Architecture.
Jim Gay: Clean (Ruby) Code
Video: East-Oriented Code at RubyConf 2014
Book: “Clean Ruby” – full of good examples which you can apply to Swift, too, and even more so to Objective-C and its meta-programming capabilities.
Avdi Grimm: Objects on Rails
http://objectsonrails.com
A free e-book which taught me how to decouple my application from Ruby on Rails. This one got me hooked on thinking past using the framework properly.

Other links of interest on the topic of software architecture:

Interesting Books

I recommend reading the following books, ordered by subjective significance to the topic.

Vaughn Vernon (2013): Implementing domain driven design, Upper Saddle River, NJ: Addison-Wesley.
Lots of practical examples and explanation for the patterns Evans laid out.

Eric Evans (2006): Domain-Driven Design. Tackling complexity in the heart of software, Upper Saddle River, NJ: Addison-Wesley.
Full of good examples and refactorings itself but a little light on actually solving implementation problems.

Michael C. Feathers (2011): Working effectively with legacy code, Upper Saddle River, NJ: Prentice Hall Professional Technical Reference.
Helps to learn decoupling code incrementally and how to test hard-to-test parts. That’s where I learned to provide means to reset singletons, and that it’s better to wrap NotificationCenter in order to replace the wrapper in tests than not test notifications at all.

Steve Freeman and Nat Pryce (2010): Growing object-oriented software, guided by tests, Boston: Pearson Education.
This book has taught me so much about Test-Driven Development! I figured out when to use functional tests, why it’s beneficial to start with a failing test on the system level to guide development, and how to create multi-layered applications with test fakes all thanks to this book.

Ivar Jacobson, Magnus Christerson, Patrik Jonsson, and Gunnar Övergaard (1990): Object-Oriented Software Engineering. A Use Case Driven Approach, Wokingham: Addison-Wesley.
Actually a recommendation by Uncle Bob in _Architecture: The Lost Years. It taught me to think about application services and use case objects. The book’s focus is on architecture, not on code. Useful practices. You may get this one used for a few dollars. I found it in my local university’s library._

Scott Millett (2014): Practicing Domain-Driven Design. Practical advice for teams implementing the development philosophy of Domain-Driven Design. With code examples in C# .NET, Scott Millett.

Robert C. Martin (2009): Clean Code. A Handbook of Agile Software Craftsmanship, Upper Saddle River: Prentice Hall.

David West (2004): Object thinking, Redmond, Wash.: Microsoft Press.

Andy Oram and Greg Wilson (Eds.) (2007): Beautiful Code, Beijing: O’Reilly.

Sandi Metz (2013): Practical object-oriented design in Ruby: an agile primer, Upper Saddle River, NJ: Addison-Wesley.
A really good read. Sadly, it’s about Ruby, not about Swift or Objective-C, but you may want to peek into it anyway.