如何在迅速中遏制警告

时间:2015-07-21 13:27:54

标签: swift pragma swift2

我有一段代码产生了很多警告(不推荐使用的API)

使用clang *我可以做

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

然而,这在swift中不起作用。

如何在swift中完成?

注意:我不想全局禁用警告,甚至也不想在文件范围内禁用警告,而只是在源代码的特定部分禁用特定警告。

编辑: 我看起来我的笔记不够清楚:我不想要条件编译(这是所谓的复制的建议答案)。 我只想在没有使用新API的情况下使警告静音。

5 个答案:

答案 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 {}

然后在没有弃用警告的情况下调用该方法(如果fooFoo的实例):

(foo as GetLatestImage).getLatestImage() // no deprecation warning

结果是你有Swift代码使用不推荐使用的API而没有任何弃用警告。

答案 3 :(得分:2)

我遇到了类或结构之外的顶级函数的问题:

@available(*, deprecated)
func GetImage(url: URL) -> UIImage? { ... }

我曾与 Apple 的一位工程师交谈过,他们告诉我,您可以通过协议隐藏实现并将扩展标记为已弃用。让我们看看它是如何工作的:

  1. 为要包装的函数创建一个具有相似签名的协议。
  2. 在扩展中的任何类或结构上使用协议。
  3. 将扩展标记为已弃用。

扩展中的所有内容都不会出现任何弃用警告。

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

  • 更改文件权限以允许在必要时进行编辑
  • 编辑符号的弃用宏。请参阅周围的API以供参考。例如。替换:
  

__ 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仍然可用并且没有替代品。

如果有任何弊端,请发表评论。

相关问题