如何为不同版本的 Xcode 编写条件

Posted

技术标签:

【中文标题】如何为不同版本的 Xcode 编写条件【英文标题】:How to Write a Conditional for Different Versions of Xcode 【发布时间】:2016-08-05 12:08:49 【问题描述】:

我正在使用两台不同的计算机开发一个应用程序。一台是我的家用机器,它是一台较旧的 MacBook Pro,但具有最新的操作系统并运行 Xcode 7.3。我使用的第二台机器是我的工作机器,它是全新的,速度极快,但仅限于 Yosemite 和 Xcode 7.2.1。

我最近在运行 Xcode 7.2.1 的机器上遇到了构建错误,但应用程序在运行较新 Xcode 的机器上构建和运行没有错误。由于 IT 政策不可调和,我无法升级工作机器,而且我真的(真的)不希望将我的家用机器降级到 Xcode 7.2.1。

所以我想做的是写一个类似于以下伪代码的条件:

if Xcode.version == 7.3
   // Run this version of the statement
   refreshControl.addTarget(self, action: #selector(ReadingTVC.pullToRefreshTableView), forControlEvents: UIControlEvents.ValueChanged)
if Xcode.version == 7.2.1
   // Run this different version of the statement
   // I still need to figure out how to rewrite the statement for 7.2.1

这可能吗?我在 Apple 文档中找到了以下内容,但 Xcode 版本没有选项。只有 swift()、os() 或 arch():

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html#//apple_ref/doc/uid/TP40014097-CH33-ID539

提前致谢!

【问题讨论】:

希望对您有所帮助 - ***.com/questions/30790188/… 【参考方案1】:

您应该只使用swift() 来检查 swift 的版本,因为 Xcode 7.3 带有 Swift 2.2 而 Xcode 7.2.1 带有 Swift 2.1.x。

对于您的代码,由于 swift 2.2 中引入了 swift(),因此您需要更改适用于两个版本的使用代码,如下所示(假设 ReadingTVCself):

// For both swift 2.1.x and swift 2.2. In swift 2.2, this will pop a 
// warning and ask you to fix. But you can wait until you work computer
// updated Xcode version to 7.3. You will be force to change when 
// upgrade to swift 3.0 since the old string based api will be removed.
// Currently it is just marked as deprecated.
refreshControl.addTarget(self, action: "pullToRefreshTableView", forControlEvents: UIControlEvents.ValueChanged)

【讨论】:

我试过这个解决方案。在我的工作计算机上,运行 Xcode 7.2.1,我收到错误:“意外的目标配置表达式(预期的 'os' 或 'arch')” 啊,对不起,我忘记了 Xcode 7.2.1(有 Swift 2.1.x)不支持swift(),它只在 swift 2.2 中引入。我为此更新了我的答案。请让我知道它是否有效。您可以在此处查看有关更改的 Xcode 发布代码:developer.apple.com/library/mac/releasenotes/DeveloperTools/…【参考方案2】:

我目前无法对其进行测试,但我认为 7.3 和 7.2.1 也有不同的 Swift 版本,因此您可以使用 swift()。除此之外,我认为错误是由于 Swift 的变化(#selector 语法?)所以这个检查无论如何都会更合适。

PS:旧版本只需要“pullToRefreshTableView”作为选择器,而不是#selector(...)。

【讨论】:

你怎么知道哪个版本的 swift 与你正在运行的 Xcode 版本捆绑在一起?我在 About Xcode 或首选项中找不到任何内容。【参考方案3】:

关于烦人的字符串历史的小提示...

        #if swift(>=4.0)
            let len = text.count
        #else
            let len = text.characters.count
        #endif

适用于 Xcode 8.0 及更高版本(也在 Xcode 9 beta 中测试)

【讨论】:

以上是关于如何为不同版本的 Xcode 编写条件的主要内容,如果未能解决你的问题,请参考以下文章

如何为较旧和较新的 Android 版本实现不同的 API?

如何为 Xcode 3.2.4 配置 Adhoc?

如何为python安装不同版本的模块

如何为声纳配置另一个与默认版本不同的 java 版本?

如何为不同的项目版本和管理 angularjs 组件

如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?