Differentiate between two Xcode targets with Swift
One way is to add Flags to target and use preprocessor. But the other way I think would be to use something like this
if Bundle.appTarget == "" { } else { }
extension Bundle {
public static var appVersion: String? {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}
public static var appBuild: String? {
return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String
}
public static func _version() -> String {
let dictionary = Bundle.main.infoDictionary!
let version = dictionary["CFBundleShortVersionString"] as! String
let build = dictionary["CFBundleVersion"] as! String
return "\(version) build \(build)"
}
public static var appTarget: String? {
if let targetName = Bundle.main.object(forInfoDictionaryKey: "CFBundleExecutable") as? String {
return targetName
}
return nil
}
}
In Xcode, go into the build configuration for a target. Find the section called Swift Compiler - Custom Flags, which contains a setting called Other Swift Flags.
Add a command-line flag for the compiler to add a flag, pretty much just like you’d do with the C compiler.
Now you’ve got -D Something
being passed to the Swift compiler. In your Swift code, you can now do this:
#if Something
let foo = "bar"
#endif
It looks a lot like the C preprocessor, but unlike C, all code in all conditional sections has to be syntactically correct or the program won’t compile. So, you can set a flag on each target in the build settings and use them in your code.
Since Xcode 8 you can set the compilation conditions in the Build Settings for each target under Active Compilation Conditions.
With those set you can use:
#if FREE
//do something
#endif
For more details see the i40west answer and comments.