如何在Swift中禁用警告?

dldeef67  于 2022-12-26  发布在  Swift
关注(0)|答案(5)|浏览(402)

我有一段代码生成了大量警告(不推荐使用的API)
使用clang*,我可以:

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

然而,这在Swift中不起作用。
如何在Swift中实现?
注意:我不想全局禁用警告,甚至不想在文件范围内禁用警告,而只想在源代码的特定部分禁用特定警告。
我不想要条件编译(这是对假定的重复的建议答案)。我只想在不使用新API的情况下消除警告。

brgchamk

brgchamk1#

截至2021年Xcode 13.0,大家的共识是,没有办法做到这一点。
如果苹果增加了这个功能,我会更新/编辑这个答案。
把它放进你的WWDC 2022愿望清单吧!

ibrsph3r

ibrsph3r2#

Swift中没有通用的结构来消除弃用警告,但有一个变通方案可以应用于许多情况

假设在类Foo上有一个方法getLatestImage(),它使用了过时的方法/类。
使用丹尼尔Thorpe描述的@available来消除方法 * 内部 * 的所有警告:

class Foo {
    @available(iOS, deprecated: 9.0)
    func getLatestImage() -> UIImage? {
        ...
    }
}

现在你想 call 方法getLatestImage()而不带一个弃用警告,你可以通过定义一个协议和一个扩展来实现:

private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}

然后调用该方法而不显示弃用警告。
如果fooFoo的示例:

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

如果要调用Foo的静态属性/函数:

(Foo.self as GetLatestImage.Type).someStaticProperty

结果是Swift代码使用了不推荐使用的API,但没有任何不推荐使用警告。

sr4lhrrt

sr4lhrrt3#

实际上,您 * 可以 * 通过在封闭的逻辑结构(即函数/类型)中使用@available来抑制这些警告。
例如,假设您有一些使用AddressBook框架的代码,但您是针对iOS 9构建的。

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

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

n6lpvg4x

n6lpvg4x4#

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

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

我和苹果的一位工程师谈过,他们告诉我你可以通过协议隐藏实现,并将扩展标记为弃用。让我们看看它是如何工作的:
1.为要 Package 的函数创建一个具有类似签名的协议。
1.在扩展中的任何类或结构上使用协议。
1.将扩展标记为已弃用。
扩展中的所有内容都不会显示任何弃用警告。

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
    }
}
qyyhg6bp

qyyhg6bp5#

虽然目前还没有办法在Swift中消除弃用警告,但从技术上讲,您可以通过编辑头文件来为特定的符号做到这一点。

  • 复制过时的符号名称
  • 选择FileOpen Quickly
  • 粘贴符号并按Enter

确保禁用快速打开框中的Swift图标

  • 选择FileShow in Finder
  • 如有必要,更改文件权限以允许编辑
  • 编辑符号的弃用宏。请参阅周围的API以获取参考。例如,replace:

__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仍然可用,并没有得到替代。
请评论,如果你能想出任何缺点。

相关问题