Checking for Debug mode in Swift
There are often a bunch of times where you want to write Swift code that only executes when you’re in Debug mode. Some obvious examples:
- Hiding ads when you generate screenshots
- Logging and printing to console
- Using a local developer/staging endpoint instead of the production one.
Still, this can kind of be a pain to manage. The Objective-C mainstay (which still works in Swift) is this very clunky macro:
#if DEBUG
let a = 2
#else
let a = 3
#endif
This, to me, is super gross: it’s imperative, clashes with other Swift syntax, and is hard to parse or do clever things with.
However, I stumbled on a little known (and, in my opinion, better) solution that checks the build configuration of your project:
_isDebugAssertConfiguration() -> Bool
Yup, that’s all you need to call: it’s a globally available function.
The method invocation on its own is a little clunky, so I bind it to a global struct that I use:
struct Utilities {
// other stuff, too.
static let isDebug = _isDebugAssertConfiguration()
}
Which means I can now use it in guards and lets and all sorts of things!
For instance, to bail out of functions early if I’m in debug mode:
// The first section only contains the ad..
// We hide the ad in debug mode so we can generate nicer screenshots.
override func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
let sectionIsAdSection = section == 0
let numberOfCellsInAdSection = Constants.isDebug ? 0 : 1
return sectionIsAdSection ?
numberOfCellsInAdSection :
matchingAnswers[section - 1].count
}
Some obvious caveats apply with this approach (it’s a flaky function that might get removed at some point, and it’s
not publicly documented) but it’s worked great for me and I recommend trying it out rather than scattering your codebase
with clunky #if DEBUG
invocations.