代码之家  ›  专栏  ›  技术社区  ›  Bedford

抑制Swift编译器警告

  •  13
  • Bedford  · 技术社区  · 10 年前

    我正在使用 Nimble assertion framework 用于Swift(Xcode 6.3 beta)中的单元测试。它工作正常,但编译器会对Nimble源代码中的一行发出警告:

    public func expect<T>(expression: () -> T?, file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T> {
        return Expectation(
            expression: Expression(
                expression: expression,
                location: SourceLocation(file: file, line: line),
                isClosure: true))
    }
    

    警告针对第一行:

    具有默认参数的参数之前的闭包参数将不会 被视为尾随结束

    这不是一个非常严重的问题,但我希望在我的项目中尽量减少编译器警告的数量(零)。是否有方法删除此警告?

    4 回复  |  直到 5 年前
        1
  •  25
  •   Julian    9 年前

    如果方法签名看起来像:

    public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T> 
    

    在第一个参数周围添加了额外的括号,用Swift 2.0和Xcode 7.1测试

    修复它的另一种方法是在闭包属性之前使用默认值的所有属性,因为尾随闭包是一种非常方便的方法

        2
  •  3
  •   Ilya Puchka    9 年前

    @Julian Krl的回答是错误的,原因有两个:

    1. 代码片段演示了错误的语法,正确的是:

    public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T>

    1. 即使在Xcode 7.1中使用正确的语法,它也不能解决这个问题,因为您不能使用尾随闭包调用此方法-它会给您带来编译错误,如 Missing argument for parameter #1 in call .

    使用提供的代码,您只会消除警告 将无法 调用此函数时使用尾随闭包。

    它修复了警告,因为在具有一个子级的Swift元组中,只能与单个变量互换。甚至 ((((value)))) the same 作为公正的 value 。看起来编译器在函数参数列表中不将具有闭包子级的元组识别为独立闭包。

        3
  •  -1
  •   Community CDub    8 年前

    致本主题的所有未来读者:答案仅适用于本案例 尾部封闭件 .AFAIK,您无法像Objective-C中那样抑制Swift警告(禁用特定行的警告),也许当Swift编译器的源代码是开源时,会有一些有效的解决方案,并且这个答案会被更新。在此之前,您可以检查这些答案(不是Swift特有的):

    In Xcode, how to suppress all warnings in specific source files?

    Is there a way to suppress warnings in Xcode?

    如果可以更改expect的签名,请将参数表达式置于末尾,如:

    public func expect<T>(file: String = __FILE__, line: UInt = __LINE__, expression: () -> T?) -> Expectation<T>
    

    老实说,将闭包参数作为第一个参数是糟糕的设计。

        4
  •  -2
  •   gnasher729    10 年前

    对我来说,这是一个非常严重的警告,你绝对应该 忽视似乎您认为的带有闭包参数的函数调用实际上是没有闭包参数的功能调用,然后是闭包。

    通过将闭包放入参数列表,或在调用之前将其分配给变量并传递该变量,可以轻松避免警告并解决问题。