如何为不同版本的 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()
,因此您需要更改适用于两个版本的使用代码,如下所示(假设 ReadingTVC
为 self
):
// 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 编写条件的主要内容,如果未能解决你的问题,请参考以下文章