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
:不会帮助我们 - 平台testingfunction :
os(iOS)
或arch(arm64)
>不会帮助你,search一下,无法确定它们在哪里定义。 (在编译器本身也许?) - 命令行标志 :在这里,我们去,这是唯一的select,你可以使用…
3.解决scheme
感觉有点像解决方法,但是做这个工作:
现在,例如,您可以使用#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 }
你可以在这里阅读更多。