The following books have shaped the way I code. I bought them for myself, and recommend them to you.
The Art of Agile Development: Pragmatic Guide to Agile Software Development
by James Shore and Shane Warden
The Art of Unit Testing: with examples in C#
by Roy Osherove
Beyond Legacy Code: Nine Practices to Extend the Life (and Value) of Your Software
by David Scott Bernstein
Clean Code: A Handbook of Agile Software Craftsmanship
by Robert Martin
I thought my code was already clean. Then I read this book, and it helped make my code
Dependency Injection Principles, Practices, and Patterns
by Mark Seemann and Steven van Deursen
Design Patterns: Elements of Reusable Object-Oriented Software
by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
Domain-Driven Design: Tackling Complexity in the Heart of Software
by Eric Evans
The Mikado Method
by Ole Ellnestam and Daniel Brolund
An effective technique for tackling
Refactoring: Improving the Design of Existing Code
by Martin Fowler
Refactoring to Patterns
by Joshua Kerievsky
Test-Driven iOS Development
by Graham Lee
The original iOS TDD book. The examples are in Objective-C, but the concepts go much deeper.
See my post Test-Driven iOS Development: The Book That Fills a Big Hole for more thoughts.
Test-Driven iOS Development with Swift 4
by Dominik Hauser
Don’t just read this; actually work through the example yourself.
Working Effectively with Legacy Code
by Michael Feathers
This book taught me how to break the cycle of fear with approaching legacy code: “I can’t refactor without tests, but I can’t add tests without refactoring.”