How do I check the iOS deployment target in a Swift conditional compilation statement?
I've tried the following:
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
// some code here
#else
// other code here
#endif
But, the first expression causes the compile error:
Expected '&&' or '||' expression
TL;DR? > Go to 3. Solution
According to Apple documentation on preprocessing directives:
The Swift compiler does not include a preprocessor. Instead, it takes advantage of compile-time attributes, build configurations, and language features to accomplish the same functionality. For this reason, preprocessor directives are not imported in Swift.
That is why you have an error when trying to use __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
which is a C preprocessing directive. With swift you just can't use #if
with operators such as <
. All you can do is:
#if [build configuration]
or with conditionals:
#if [build configuration] && ![build configuration]
Again from the same documentation:
Build configurations include the literal true and false values, command line flags, and the platform-testing functions listed in the table below. You can specify command line flags using -D <#flag#>.
true
and false
: Won't help usos(iOS)
or arch(arm64)
> won't help you, searched a bit, can't figure where they are defined. (in compiler itself maybe?)Feels a bit like a workaround, but does the job:
Now for example, you can use #if iOSVersionMinRequired7
instead of __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0
, assuming, of course that your target is iOS7.
That basically is the same than changing your iOS deployment target version in your project, just less convenient... Of course you can to Multiple Build configurations with related schemes depending on your iOS versions targets.
Apple will surely improve this, maybe with some built in function like os()
...
Tested in Swift 2.2
By saying Deployment Target
you mean iOS version
, or App Target
? Below I'm providing the solution if you have multiple versions of the app (free app, payed app, ...), so that you use different App Targets.
You can set custom Build configurations:
1. go to your project / select your target / Build Settings / search for Custom Flags
2. for your chosen target set your custom flag using -D
prefix (without white spaces), for both Debug and Release
3. do above steps for every target you have
To differentiate between targets you can do something like this:
var target: String {
var _target = ""
#if BANANA
_target = "Banana"
#elseif MELONA
_target = "Melona"
#else
_target = "Kiwi"
#endif
return _target
}
override func viewDidLoad() {
super.viewDidLoad()
print("Hello, this is target: \(target)"
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With