我有一段代码产生了很多警告(不推荐使用的API)
使用clang *我可以做
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
...
#pragma clang diagnostic pop
然而,这在swift中不起作用。
如何在swift中完成?
注意:我不想全局禁用警告,甚至也不想在文件范围内禁用警告,而只是在源代码的特定部分禁用特定警告。
编辑: 我看起来我的笔记不够清楚:我不想要条件编译(这是所谓的复制的建议答案)。 我只想在没有使用新API的情况下使警告静音。
答案 0 :(得分:115)
截至2018年,Xcode 10.0,共识是没有办法实现这一点。
如果Apple添加该功能,我将更新/编辑此答案。
将它放入WWDC 2019的愿望清单中!
答案 1 :(得分:34)
实际上,可以通过在封闭的逻辑结构中使用root
来抑制这些警告(即函数/类型)。
例如,假设您有一些使用AddressBook框架的代码,但是您正在构建针对iOS 9的内容。
@available
从Xcode 7.0.1开始,这将阻止显示内联警告。
答案 2 :(得分:23)
在Swift中没有一般的构造来压缩弃用警告,但是在许多情况下有一种可以应用的解决方法。
假设您在类getLatestImage()
上有一个方法Foo
,它使用不推荐使用的方法/类。
使用@available
作为Daniel Thorpe描述的方法,以隐藏里面的所有警告方法:
@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
...
}
现在,您希望在没有弃用警告的情况下调用方法getLatestImage()
。您可以通过首先定义协议和扩展来实现这一目标:
private protocol GetLatestImage {
func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}
然后在没有弃用警告的情况下调用该方法(如果foo
是Foo
的实例):
(foo as GetLatestImage).getLatestImage() // no deprecation warning
结果是你有Swift代码使用不推荐使用的API而没有任何弃用警告。
答案 3 :(得分:2)
我遇到了类或结构之外的顶级函数的问题:
@available(*, deprecated)
func GetImage(url: URL) -> UIImage? { ... }
我曾与 Apple 的一位工程师交谈过,他们告诉我,您可以通过协议隐藏实现并将扩展标记为已弃用。让我们看看它是如何工作的:
扩展中的所有内容都不会出现任何弃用警告。
protocol ImageStoreProtocol {
func imageFromURL(_ url: URL) -> UIImage?
}
class ImageStore {}
@available(*, deprecated)
extension ImageStore: ImageStoreProtocol {
func imageFromURL(_ url: URL) -> UIImage? {
return GetImage(url: url) // Warning does't show up
}
}
答案 4 :(得分:0)
虽然目前尚无办法在Swift中使弃用警告静音,但从技术上讲,您可以通过编辑头文件来对特定符号执行此操作。
File
> Open Quickly
粘贴符号,然后按Enter
确保在“快速打开”框中禁用了Swift图标
选择File
> Show in Finder
__ OSX_AVAILABLE_BUT_DEPRECATED(__ MAC_10_6,__ MAC_10_10,__ IPHONE_3_0,__ IPHONE_8_0)
与
__ OSX_AVAILABLE_STARTING(__ MAC_10_6,__IPHONE_3_0)
现在,有一种令人分心的警告,您无能为力。
我知道,它很脏。但是,如果当前的SDK中没有没有可用的替代API ,那么它应该是安全的。 Xcode的新版本发布后,更改将被覆盖,您将再次看到警告。然后,您可以测试新的SDK和OS,以确保已弃用的API仍然可用并且没有替代品。
如果有任何弊端,请发表评论。