João Colaço
João Colaço

Reputation: 1301

Differentiate between two Xcode targets with Swift

How can I differentiate between two Xcode targets with Swift? The idea is to make a free and a paid version of an app with the same code base in Xcode.

With objective C I could use preprocessor macros but with Swift those are unavailable.

Upvotes: 35

Views: 18286

Answers (3)

Michał Ziobro
Michał Ziobro

Reputation: 11762

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
    }
}

Upvotes: 4

João Colaço
João Colaço

Reputation: 1301

Since Xcode 8 you can set the compilation conditions in the Build Settings for each target under Active Compilation Conditions.

Active Compilation Conditions Screenshot

With those set you can use:

#if FREE
   //do something
#endif

For more details see the i40west answer and comments.

Upvotes: 22

Jeremy
Jeremy

Reputation: 4381

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.

Swift Compiler Flags

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.

Upvotes: 49

Related Questions