我已经为Xcode构建了一个插件,主要通过Alcatraz部署。该实用程序从GitHub获取我的插件源代码,编译它,并在成功后将其安装到正确的目录中。这一直运行得很好,直到发布Swift 2.2的Xcode 7.3版本。
Swift 2.2引入了一种新的指定选择器的方式。以前,您需要提供一个带有函数名称的字符串,例如:
然而,新的方法使用 #selector,如下所示:
Swift 2.2引入了一种新的指定选择器的方式。以前,您需要提供一个带有函数名称的字符串,例如:
NSNotificationCenter.defaultCenter().addObserver( self, selector: "applicationFinishedLoading:", name: NSApplicationDidFinishLaunchingNotification, object: nil )
然而,新的方法使用 #selector,如下所示:
NSNotificationCenter.defaultCenter().addObserver( self, selector: #selector(ColorSenseRainbow.applicationFinishedLoading(_:)), name: NSApplicationDidFinishLaunchingNotification, object: nil )
如果我将我的代码转换成新方法,那么使用旧版本Xcode(7.2.1及更早版本)的用户将无法使用我的插件,因为它不知道新的#selector。我知道这一点是因为我已经进行了转换,以消除过期警告,并得到了用户反馈。但很可能下一个Xcode版本将转移到Swift 3,我将不得不做出这个改变。
因此,我更喜欢找到一种方式让编译器选择适用于Xcode版本的代码。类似于这样的伪代码。
#if (XCode_Version >= 7.3)
// use @selector ( ThisClass.functionName)
#else
// use selector: "functionName:"
#endif
我知道有一个swift()函数可以用来告诉版本,但那只在Swift 2.2中引入,如果我使用它,编译将失败,无法在Xcode 7.2.1及以下版本中使用。这让我陷入与@selector函数相同的境地。
另一种选择是将我即将发布的版本作为最后一个使用"functionName:"方法的版本。然后我会在GitHub上提供一个预编译的副本供旧版本Xcode的用户手动下载和安装。
感谢您的帮助。
Array
字面量语法这样基本的东西。任何想要编写Swift代码的人都应该理解源代码和ABI的不稳定性将在未来一段时间内存在很大程度上。支持一些毫无意义的东西。 - Alexander