Swift:iOS部署目标命令行标志

如何在Swift条件编译语句中检查iOS部署目标?

我已经尝试了以下内容:

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 // some code here #else // other code here #endif 

但是,第一个expression式导致编译错误:

 Expected '&&' or '||' expression 

TL; DR? >转到3.解决scheme

1.在Swift中进行预处理

根据苹果关于预处理指令的文件 :

Swift编译器不包含预处理器。 相反,它利用编译时间属性,构buildconfiguration和语言function来实现相同的function。 由于这个原因,预处理器指令不能在Swift中导入。

这就是为什么在尝试使用C预处理指令__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0时出现错误。 有了swift,你就不能使用像#if的操作符。 你所能做的只是:

 #if [build configuration] 

或条件:

 #if [build configuration] && ![build configuration] 

2.有条件的编译

再次从相同的文件 :

构buildconfiguration包括下表中列出的文字真假值,命令行标志和平台testingfunction。 您可以使用-D <#flag#>指定命令行标志。

  • false :不会帮助我们
  • 平台testingfunctionos(iOS)arch(arm64) >不会帮助你,search一下,无法确定它们在哪里定义。 (在编译器本身也许?)
  • 命令行标志 :在这里,我们去,这是唯一的select,你可以使用…

3.解决scheme

感觉有点像解决方法,但是做这个工作: 其他Swift标志

现在,例如,您可以使用#if iOSVersionMinRequired7而不是__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 ,当然假设您的目标是iOS7。

这基本上与在项目中更改iOS部署目标版本相同,不太方便…当然,您可以根据iOS版本的目标使用相关scheme进行多版本configuration。

苹果肯定会改善这一点,也许有一些内置函数像os()

在Swift 2.2中testing

通过说Deployment Target你的意思是iOS version ,或App Target ? 下面我提供的解决scheme,如果你有多个版本的应用程序(免费的应用程序,付费应用程序,…),所以你使用不同的应用程序目标。

您可以设置自定义的生成configuration:
1.转到您的项目/select您的目标/构build设置/search自定义标志
2.对于您select的目标,使用-D前缀(无空白)设置您的自定义标志,用于debugging和发布
3.为每一个目标做上面的步骤

在这里输入图像说明

要区分目标,你可以这样做:

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

你不能这样做的条件编译语句。 Swift不支持Apple称之为“复杂的macros”。 generics和types在他们的想法中做同样的事情,取得更好的结果。 (这是他们发布的链接https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_13

这是我提出的一个函数来完成同样的事情(显然,只需用一个布尔值或只是选项本身来replacestring返回值对你有用的东西):

 func checkVersion(ref : String) -> String { let sys = UIDevice.currentDevice().systemVersion switch sys.compare(ref, options: NSStringCompareOptions.NumericSearch, range: nil, locale: nil) { case .OrderedAscending: return ("\(ref) is greater than \(sys)") case .OrderedDescending: return ("\(ref) is less than \(sys)") case .OrderedSame: return ("\(ref) is the same as \(sys)") } } // Usage checkVersion("7.0") // Gives "7.0 is less than 8.0" checkVersion("8.0") // Gives "8.0 is the same as 8.0" checkVersion("8.2.5") // Gives "8.2.5 is greater than 8.0" 

我知道你的问题在这里已经有一段时间了,但如果有人还在寻找答案,他们应该知道,从Swift 2.0开始,你可以这样做:

 if #available(iOS 8, *) { // iOS 8+ code } else { // older iOS code } 

你可以在这里阅读更多。