问题夫特替代#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回退以及一般的宏。
您可能会考虑为第三方实用程序使用单独的框架目标,并为该目标指定适当的构建设置。然后在您的主项目中,您可以保留适合您的代码的构建设置。 – Rob 2015-02-06 14:37:51
那些经过的人的一些具体信息...截至2015年5月13日,Swift不支持预处理器宏。从*使用Swift与Cocoa和Objective-C *(通道互操作性,部分预处理器指令) “Swift编译器不包含预处理器,而是利用编译时属性,编译配置和语言特性以完成相同的功能。因此,预处理器指令不会在Swift中导入。“ 它看起来并不像Swift会支持clang诊断宏,它目前也没有内置的替代方案。 – 2015-05-13 17:10:10
@BlakeMerryman我建议你从你的评论中添加一个答案,并通知OP,以便他可以接受它。所以它不会显示为没有答案了。干杯。 – phlebotinum 2015-06-23 09:39:02