如何在Swift中禁止特定的警告

7
我有一个Swift函数,做类似于这样的事情:
func f() -> Int {
    switch (__WORDSIZE) {
        case 32: return 1
        case 64: return 2
        default: return 0
    }
}

因为__WORDSIZE是一个常量,编译器总是至少在switch体中给出一个警告。实际标记哪些行取决于我正在构建的目标(例如iPhone 5与6;有趣的是,iPhone 5对64位情况给出一个警告,而iPhone 6对32位和默认情况分别给出两个警告)。
我发现#pragma的Swift等效项是// MARK:,所以我尝试了一下。
// MARK: clang diagnostic push
// MARK: clang diagnostic ignored "-Wall"
func f() -> Int {
    switch (__WORDSIZE) {
        case 32: return 1
        case 64: return 2
        default: return 0
    }
}
// MARK: clang diagnostic pop

但警告仍然存在,MARK似乎没有作用。

为了解决这个问题,我现在有类似于以下的东西:

#if arch(arm) || arch(i386)
    return 1
#else
    #if arch(arm64) || arch(x86_64)
        return 2
    #else
        return 0
    #endif
#endif

- 当然这不一样。有任何提示吗…?

1
目前,在Swift代码中无法抑制特定的警告(参见例如https://dev59.com/OlwZ5IYBdhLWcg3wWvVY)。作为一种解决方法,您可以改用`sizeof(Int.self)`(其值为4或8)。- 很有趣想知道为什么您需要这个函数。 - Martin R
谢谢,你的解决方案有效。有关代码,请参见此处:https://dev59.com/pGAg5IYBdhLWcg3wE3jQ — jstn的答案。 - Stefan
1
我之前没有见过这个,但是在这里http://stackoverflow.com/a/31429991/1187415有一个(非常相似的)解决方案,它不需要在单词大小上进行切换。 - Martin R
fwiw switch nil ?? x 可以消除 "Switch condition evaluates to a constant" 警告。该警告很烦人,因为每次构建时都会聚焦问题导航器选项卡。 - danneu
1个回答

6

目前(Xcode 7.1),似乎没有办法抑制Swift中的特定警告(例如,请参见如何在Swift中抑制警告)。

在您的特殊情况下,您可以通过计算字节中的单词数来愚弄编译器:

func f() -> Int {
    switch (__WORDSIZE / CHAR_BIT) { // Or: switch (sizeof(Int.self))
    case 4: return 1
    case 8: return 2
    default: return 0
    }
}

这在32位和64位架构上都能编译通过,且没有任何警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接