我有一段代码生成了大量警告(不推荐使用的API)
使用clang*,我可以:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
...
#pragma clang diagnostic pop
然而,这在Swift中不起作用。
如何在Swift中实现?
注意:我不想全局禁用警告,甚至不想在文件范围内禁用警告,而只想在源代码的特定部分禁用特定警告。
我不想要条件编译(这是对假定的重复的建议答案)。我只想在不使用新API的情况下消除警告。
5条答案
按热度按时间brgchamk1#
截至2021年Xcode 13.0,大家的共识是,没有办法做到这一点。
如果苹果增加了这个功能,我会更新/编辑这个答案。
把它放进你的WWDC 2022愿望清单吧!
ibrsph3r2#
Swift中没有通用的结构来消除弃用警告,但有一个变通方案可以应用于许多情况。
假设在类
Foo
上有一个方法getLatestImage()
,它使用了过时的方法/类。使用丹尼尔Thorpe描述的
@available
来消除方法 * 内部 * 的所有警告:现在你想 call 方法
getLatestImage()
而不带一个弃用警告,你可以通过定义一个协议和一个扩展来实现:然后调用该方法而不显示弃用警告。
如果
foo
是Foo
的示例:如果要调用Foo的静态属性/函数:
结果是Swift代码使用了不推荐使用的API,但没有任何不推荐使用警告。
sr4lhrrt3#
实际上,您 * 可以 * 通过在封闭的逻辑结构(即函数/类型)中使用
@available
来抑制这些警告。例如,假设您有一些使用AddressBook框架的代码,但您是针对iOS 9构建的。
从Xcode 7.0.1开始,这将阻止显示内联警告。
n6lpvg4x4#
我遇到了类或结构体之外的顶级函数的问题:
我和苹果的一位工程师谈过,他们告诉我你可以通过协议隐藏实现,并将扩展标记为弃用。让我们看看它是如何工作的:
1.为要 Package 的函数创建一个具有类似签名的协议。
1.在扩展中的任何类或结构上使用协议。
1.将扩展标记为已弃用。
扩展中的所有内容都不会显示任何弃用警告。
qyyhg6bp5#
虽然目前还没有办法在Swift中消除弃用警告,但从技术上讲,您可以通过编辑头文件来为特定的符号做到这一点。
File
〉Open Quickly
Enter
确保禁用快速打开框中的Swift图标
File
〉Show in Finder
__OSX可用,但已弃用(__MAC_10_6、__MAC_10_10、__iPhone 3_0、__iPhone 8_0)
与
__OSX_可用_正在启动(__MAC_10_6、__iPhone _3_0)
现在少了一个让人分心的警告,你对此无能为力。
我知道,这是肮脏的。但如果有没有替代API可用在当前的SDK,它应该是安全的。一旦一个新版本的Xcode出来,改变将被覆盖,你会看到警告再次。然后你可以测试新的SDK和操作系统,以确保弃用的API仍然可用,并没有得到替代。
请评论,如果你能想出任何缺点。