Let's talk about Xcode


3 min read

Those who follow me on Twitter know that I switched from .NET development to iOS development in October 2021. My employer made this switch possible. So I was able to work on my personal development without changing my employer. Thank you for that, dear Parship Group.

App development is cool. I enjoy building a product that users actually hold in their hands and use on a daily basis. My .NET based microservices were always just running in the background doing their (of course still important) work. Now it's different. Many thousands of users use our app every day, taking advantage of features developed directly by me and my team. I like that.

And you know what else I like? Swift. Swift is a really cool programming language. It's worth a look even if you have no other ambitions to dive into the Apple ecosystem.

But today I also want to tell you about my pain. Because to do native iOS development you need Xcode.


Apple's IDE for developing iOS, WatchOS, TvOS and all other OS apps. If, like me, you come from the .NET or Java world and are thus used to VisualStudio, IntelliJ or Rider, Xcode is quite a shock. The whole topic of Developer Experience (DX for short) seems to be quite new to Apple. What passes for "auto-completion" in Xcode is not that great compared to most other modern IDEs. Periodically, when I write the keyword nil (the equivalent of null in Java and C#), Xcode auto-completes to NilCoalescingPrecedence. WTF?

"Just run the build again"

But that's not all. I don't know when I last worked in an ecosystem where I heard so often "Oh, you have that error? Just start the build again. It always works on the 2nd or 3rd try". Really? What should change if I press the same button again? Remember the following quote?

Insanity is when you do the same thing over and over again and expecting different results.

But maybe insanity and iOS development are closer to each other than I've been willing to admit. ๐Ÿ˜„๐Ÿ™ˆ

"Maybe you should delete Derived Data"

But then there are the errors that still persist in the 56th build attempt. That's when it's usually "Delete Derived Data". For all non-Xcoders: that's a directory where Xcode keeps all sorts of build stuff (like fully compiled packages). And apparently Xcode thinks it's MY job to clean it up every now and then. Why should the development environment do that for me?

They are like Breakpoints. But difficult to remove.

Breakpoints are probably known by everyone. Now and then they are quite handy. With one click they are set and with another one they are removed. Not so with Xcode. You can set them with one click, but another click only deactivates them. To remove it, you have to drag it into the editor area with the mouse, without any visual feedback, of course. Intuitive, isn't it?

Any Alternatives?

But there is light at the end of the tunnel. JetBrains to the rescue. As so often before. Because JetBrains also offers an IntelliJ-based IDE for iOS development called AppCode. But AppCode still has a long way to go. Storyboards are only supported by automatically opening Xcode and SwiftUI previews are still missing. However, I already prefer AppCode over Xcode. It is and remains a JetBrains development environment. They are hard to beat.

It's not that bad ๐Ÿ˜„

In the end, it's important for me to say that development in the iOS environment is still fun. There are also days when Xcode largely does what it's supposed to. And then you have Swift and some other things that are just great.