使用Swift区分两个Xcode目标

时间:2014-12-03 23:48:31

标签: ios xcode swift

如何使用Swift区分两个Xcode目标?我们的想法是在Xcode中创建一个具有相同代码库的应用程序的免费和付费版本。

使用目标C我可以使用预处理器宏,但是使用Swift则不可用。

3 个答案:

答案 0 :(得分:29)

在Xcode中,进入目标的构建配置。找到名为 Swift编译器 - 自定义标志的部分,其中包含一个名为其他Swift标志的设置。

为编译器添加命令行标志以添加标志,就像你使用C编译器一样。

Swift Compiler Flags

现在你已经将-D Something传递给了Swift编译器。在Swift代码中,您现在可以执行此操作:

#if Something
    let foo = "bar"
#endif

它看起来很像C预处理器,但与C不同,所有条件部分中的所有代码都必须在语法上正确,否则程序将无法编译。因此,您可以在构建设置中的每个目标上设置一个标记,并在代码中使用它们。

答案 1 :(得分:7)

从Xcode 8开始,您可以在活动编译条件下的每个目标的构建设置中设置编译条件。

Active Compilation Conditions Screenshot

使用这些设置,您可以使用:

#if FREE
   //do something
#endif

有关详细信息,请参阅i40west answer和评论。

答案 2 :(得分:0)

一种方法是将Flags添加到目标并使用预处理器。但是我认为另一种方式是使用这样的

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