如何使用Swift区分两个Xcode目标?我们的想法是在Xcode中创建一个具有相同代码库的应用程序的免费和付费版本。
使用目标C我可以使用预处理器宏,但是使用Swift则不可用。
答案 0 :(得分:29)
在Xcode中,进入目标的构建配置。找到名为 Swift编译器 - 自定义标志的部分,其中包含一个名为其他Swift标志的设置。
为编译器添加命令行标志以添加标志,就像你使用C编译器一样。
现在你已经将-D Something
传递给了Swift编译器。在Swift代码中,您现在可以执行此操作:
#if Something
let foo = "bar"
#endif
它看起来很像C预处理器,但与C不同,所有条件部分中的所有代码都必须在语法上正确,否则程序将无法编译。因此,您可以在构建设置中的每个目标上设置一个标记,并在代码中使用它们。
答案 1 :(得分:7)
从Xcode 8开始,您可以在活动编译条件下的每个目标的构建设置中设置编译条件。
使用这些设置,您可以使用:
#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
}
}