如何迅速使警告静音


98

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

使用clang *我可以做

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

但是,这并不迅速。

如何快速进行?

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

编辑:我似乎我的笔记不够清楚:我不希望条件编译(这是假定重复的建议答案)。我只想在不使用新API的情况下使警告静音。



4
这不是重复项。另一个问题无法回答这个问题。
克劳斯·约根森(ClausJørgensen)2015年

@ClausJørgensen无法以哪种方式回答此问题?链接问题的答案中没有其他说明。只是条件编译或新#available宏,开发人员应在其中使用新方法,如果没有新方法,则应使用旧方法。
zrzka

@robertvojta不,答案呢,其实,不是状态,有没有其他的方法来沉默警告。
克劳斯·

2
这不是骗人的 如果您收到缺少初始化器的警告,那该怎么办?
NSTJ

Answers:


157

截至2020年,Xcode 12.0,共识是没有办法实现这一目标。

如果Apple添加了此功能,我将更新/编辑此答案。

将其放入WWDC 2021的愿望清单中!


21
该死的,真是令人讨厌。有时它失控了。至少可以说这很烦人。
Isuru

2
我想对此答案投百万票,但它的确回答得很好,所以+1 :-)
Deadbeef

3
@Isuru到那时我会很恼火,只需要重建整个东西。猜出警告的有效性
Sirens

1
@Isuru大多数应该固定,而不是忽略。
凯文'18

3
太令人沮丧了!感谢您不断更新此答案。
Dan Loewenherz

48

在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

结果是您拥有使用不推荐使用的API且没有任何不推荐使用警告的Swift代码。


好聪明。有点邪恶?:)但是很好。非常适合用例,例如抑制已过时不推荐使用的AddressBook框架某些方面的持续使用的警告,但是替换实际上并不能提供所有必需的功能。谢谢。
邓肯·巴贝奇

4
如果可以的话,我会寄给您六包您最喜欢的饮料。先生,您的头脑很棒,谢谢。
约翰(John John)

@John谢谢您的客气!它确实起作用,我不得不提出它,因为我们将警告视为代码库中的错误,并且仍有一部分仍在使用不赞成使用的库。
Tammo Freese '18

1
@John,您寄给他六包吗?:P这太棒了。天才。谢谢。
Baran Emre

你是个邪恶的天才。
Krypt

37

实际上,您可以通过使用@available封闭的逻辑结构(即功能/类型)抑制这些警告。

例如,假设您有一些使用AddressBook框架的代码,但是要针对iOS 9进行构建。

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

从Xcode 7.0.1开始,这将防止显示内联警告。


6
是的,但是当您呼叫addressBookStatus()... 时,您会看到相同的警告,标记为已弃用。
瓦伦丁·谢尔金

3
专业提示:如果您想让整个班级的学生保持沉默,只需在您的课堂声明上猛烈抨击这只小狗(例如:class ViewController: UIViewController
Sirens,2016年

2
@Sirens然后你就会看到这个警告每次(在Xcode 8至少)调用这个类☹️时间
亚历山大Vasenin

有人通过此修复程序成功消除了所有不推荐使用的警告吗?我能够将它们的数量减少到一个,但是我看不到摆脱最后一个的方法。有什么建议?
亚历山大·瓦塞宁

1
那么,如何使用这个沉默的警告,“从‘CGFloat.NativeType’(又名‘双师型’),以不相关类型的‘浮动’铸总是失败”时,我做的if CGFloat(0).native is Float { … }?答:我不使用它,因为您没有回答问题。
Slipp D. Thompson

1

尽管目前尚无办法在Swift中使弃用警告静音,但从技术上讲,您可以通过编辑头文件来对特定符号执行此操作。

  • 复制不建议使用的符号名称
  • 选择File>Open Quickly
  • 粘贴符号并按 Enter

    确保在“快速打开”框中禁用了“快速”图标

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

如果您有任何缺点,请发表评论。


争取足智多谋,但会在我的嘴里留下肮脏的味道:P
Matt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.