2015-02-06 72 views
15

问题夫特替代#pragma的铛诊断

我最近在这段代码遇到在第三方实用程序(WEPopover)警告:

warning: 'contentSizeForViewInPopover' is deprecated: first deprecated in iOS 7.0 - Use UIViewController.preferredContentSize instead. [-Wdeprecated-declarations] 
      _effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover; 

Objective-C中对此的一个临时修复是使用编译指示诊断来消除错误(我会让代码作者处理一个真正的修复)。所以我修改,像这样的代码:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
      _effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover; 

#pragma clang diagnostic pop 

问题

这工作得很好,但是这让我考虑一下,其中一个需要编码时,沉默了类似的误报警告,如果任何存在替代办法在Swift中?

考虑

我观察到的事实,我可以关闭这样的警告项目范围(使用Xcode的设置),但我想如上所述考虑直列问题。我还考虑在我的Swift项目中添加一个#define到.bridging-header.h文件中,并以某种方式利用它。但是我正在寻找一个Swift特定的解决方案来解决这个问题。我明白,编译指示不再可用,我已经搜索过,发现类似但不重复的问题。

已更新解决方案:雨燕2.0

提供的答案我处理有关内嵌警告的关注。可用性命令应该允许完全避免这些问题,因为在编译时会发出警告。

苹果斯威夫特书明确指出:

“您使用的可靠性条件if或警卫语句 有条件地执行代码块,这取决于这些API是否 要使用可在运行。编译器在验证该“代码块中的 API可用时使用可用性条件中的 信息。

if #available(iOS 9, OSX 10.10, *) { 
// Use iOS 9 APIs on iOS, and use OS X v10.10 APIs on OS X 
} else { 
// Fall back to earlier iOS and OS X APIs 
} 

摘自:苹果公司‘雨燕编程语言(斯威夫特2预发行)’的iBooks。 https://itun.es/us/k5SW7.l

除非满足可用条件,否则甚至可以使用与可用性结合的guard语句提前退出范围。苹果公司“在可可和Objective-C中使用Swift(Swift 2预发行版)”,iBooks。https://itun.es/us/utTW7.l

此外,我处理宏的相关问题如下所述。请记住,Swift没有预处理器,这些工具似乎是要走的路。

简单的宏

你在哪里通常使用#define指令来 定义在C和Objective-C原始不变,斯威夫特您使用 全局常量来代替。例如,常量定义#define FADE_ANIMATION_DURATION 0.35可以在Swift中更好地表示,让 FADE_ANIMATION_DURATION = 0.35。因为在C和Objective-C源文件定义的简单定类宏 直接映射斯威夫特全局变量,编译器会自动 进口简单的宏“

摘自:苹果公司“,利用斯威夫特与可可和Objective- C (Swift 2 Prerelease)。“iBooks。 https://itun.es/us/utTW7.l

复杂的宏

复杂的宏以C和Objective-C使用,但在斯威夫特没有对应 。复杂的宏是没有定义常量的宏,包括括号括起来的函数式的宏( )。您在C和Objective-C中使用复杂宏 以避免类型检查约束或避免重新键入大量样板代码。但是,宏可能会使 调试和重构变得困难。在Swift中,您可以使用函数 和泛型来获得相同的结果,而不会有任何折衷。 因此,“复杂的宏,在C和Objective-C源 文件没有提供给您的SWIFT CODE。”

摘自:苹果公司“使用斯威夫特与可可和Objective-C(斯威夫特2预售)。“iBooks。 https://itun.es/us/utTW7.l

API的开发人员将能够使用以标记功能斯威夫特的可用性:

available(iOS 8.0, OSX 10.10, *) 
func useShinyNewFeature() { 
    // ... 
} 

摘自:苹果公司“使用斯威夫特与可可和Objective-C(斯威夫特2预售)。“iBooks。 https://itun.es/us/utTW7.l

将这些标记添加到为Swift重写的函数似乎是一种维护Frameworks向后兼容性的好方法。警卫/可用组合将允许这些框架的用户根据需要调整逻辑。这让我放心地处理在线警告,API回退以及一般的宏。

+0

您可能会考虑为第三方实用程序使用单独的框架目标,并为该目标指定适当的构建设置。然后在您的主项目中,您可以保留适合您的代码的构建设置。 – Rob 2015-02-06 14:37:51

+1

那些经过的人的一些具体信息...截至2015年5月13日,Swift不支持预处理器宏。从*使用Swift与Cocoa和Objective-C *(通道互操作性,部分预处理器指令) “Swift编译器不包含预处理器,而是利用编译时属性,编译配置和语言特性以完成相同的功能。因此,预处理器指令不会在Swift中导入。“ 它看起来并不像Swift会支持clang诊断宏,它目前也没有内置的替代方案。 – 2015-05-13 17:10:10

+0

@BlakeMerryman我建议你从你的评论中添加一个答案,并通知OP,以便他可以接受它。所以它不会显示为没有答案了。干杯。 – phlebotinum 2015-06-23 09:39:02

回答

2

从版本2.0开始(目前处于测试阶段),Swift仍然不包含预处理器,并且不会很快(如果有的话)随时更改。预处理器允许的有益能力以各种方式嵌入到语言本身中(我不会在这里涵盖所有内容,请参阅文档)并且是编译时级别的功能。

有两个功能,我想提一提(一老一新的),可能是你在找什么:

  1. 条件编译 - 作为覆盖Using Swift with Cocoa and Objective-C,就可以实现条件编译语句,允许您只编译某些操作系统或处理器体系结构的代码。如果看起来是这样的:

enter image description here

  • 检查API可用性 - 作为覆盖The Swift Programming Language,您可以根据平台和OS现在检查API可用性版。这将允许您利用更新的API,同时允许您处理该功能在较旧(或不同)平台或OS上不可用的情况。您可以使用它来替代实现或向用户提供解释。如果看起来是这样的:
  • enter image description here

    这些工具(与其他许多语言内置的一起)应允许开发人员更换的Objective-C和C预处理宏。就我个人而言,我认为这是一个巨大的进步。