抑制 Swift 编译器警告

13

我正在使用Nimble断言框架进行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个回答

25
如果方法签名如下,您就可以避免警告: ```

如果方法签名如下,您就可以避免警告:

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

在第一个参数周围添加额外的括号,已经在Swift 2.0和Xcode 7.1中进行了测试。

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


Xcode 8:仍然可用!此外,在第一个默认参数之前,()将围绕闭包。 - David H
适用于Xcode 8.2。但我猜这是未记录的,是吗? - parametr

3

@Julian Król的答案有两个错误:

  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))))value相同的。看起来编译器在函数参数列表中没有将带有闭包子项的元组识别为独立的闭包。


谢谢你纠正我,我打错了。无论如何,我会把闭包放在最后一个属性上,以便在列表中有任何带有默认值的属性时能够使用尾随语法。已修复我的答案,感谢你的指正 :) - Julian

-1
针对此主题的所有未来读者:答案仅适用于尾随闭包的情况。据我所知,没有办法像在 Objective-C 中一样抑制 Swift 警告(禁用特定行的警告),也许当 Swift 编译器的源代码开放时,会有一些有效的解决方案,并更新此答案。在那之前,您可以查看这些答案(不是 Swift 特定的):

在 Xcode 中如何抑制特定源文件中的所有警告?

是否有一种方法可以在 Xcode 中抑制警告?

如果您可以更改 expect 的签名,则将参数表达式放置在末尾,例如:

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

说实话,将闭包参数作为第一个参数是设计不良。

2
谢谢。我是Swift的新手,我以为带有默认值的参数必须留在参数列表的末尾。 - Bedford
1
我认为带有默认值的参数也应该在列表的末尾。如果你有一个闭包和默认参数,那么这个警告是不可避免的。 - SimplGy
@SimplGy 我同意,但在这种情况下,您可以使用此解决方法。但是,在参数列表的末尾设置默认值绝对是更好的风格。 - Dániel Nagy
1
我认为你建议更改基础库?那不是解决方法。我想在我的代码中编写一个具有闭包和默认参数的函数。有没有一种解决办法可以让我做到这一点?我不认为我可以消除那个警告。 - SimplGy
1
@DánielNagy 这只是一个解决方法,我不确定我们是否应该将解决方法标记为正确答案。另外,我不确定我们是否应该建议新开发人员分叉外部库以抑制编译器警告。我已经在谷歌上搜索了一段时间以抑制Swift警告,这不是一件容易的事情,具有讽刺意味的是,这篇文章在大多数搜索中排名靠前,这令人沮丧,因为问题非常准确,但我认为答案并不好。最多应该是一条评论。 - Jeremy Chone
显示剩余5条评论

-2

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

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


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