Xcode 8/Swift 3:"UIViewController类型的表达式未使用"警告

Gru*_*kes 229 ios swift

我有以下功能,以前干净地编译,但使用Xcode 8生成警告.

func exitViewController()
{
    navigationController?.popViewController(animated: true)
}
Run Code Online (Sandbox Code Playgroud)

"表达式类型"UIViewController?"未使用".

为什么要说这个,有没有办法删除它?

代码按预期执行.

tkt*_*ota 498

TL; DR

popViewController(animated:)返回UIViewController?,并且编译器正在发出警告,因为您没有捕获该值.解决方案是将其分配给下划线:

_ = navigationController?.popViewController(animated: true)
Run Code Online (Sandbox Code Playgroud)

Swift 3改变

在Swift 3之前,默认情况下所有方法都有"可丢弃的结果".如果未捕获方法返回的内容,则不会发出警告.

为了告诉编译器应该捕获结果,必须@warn_unused_result在方法声明之前添加.它将用于具有可变形式的方法(例如sort和sortInPlace).你会添加@warn_unused_result(mutable_variant="mutableMethodHere")告诉编译器.

但是,使用Swift 3时,行为会被翻转.现在所有方法都警告不会捕获返回值.如果要告诉编译器不需要警告,请@discardableResult在方法声明之前添加.

如果您不想使用返回值,则必须通过将其分配给下划线来明确告诉编译器:

_ = someMethodThatReturnsSomething()
Run Code Online (Sandbox Code Playgroud)

将此添加到Swift 3的动机:

  • 防止可能的错误(例如,使用sort它认为它修改了集合)
  • 不捕获或需要捕获其他协作者的结果的明确意图

UIKit API似乎落后于此,而@discardableResult不是在popViewController(animated:)不捕获返回值的情况下添加完全正常(如果不是更常见)的使用.

阅读更多

  • 这是可怕的语法.他们为什么要这样做?呸. (37认同)
  • 这是(在我看来)肯定是从Swift 2退后一步,特别是当有这样的方法时,即使它们_do_返回一个值,也有完全有效的用例,你只是不使用它. (15认同)
  • 1.你不需要`let`:你可以分配到_没有用`let`或`var`它前面. (15认同)
  • 2. @NicolasMiari [文件的错误(http://bugreport.apple.com).还有对于那些返回一个值,但它的预期,人们可能会忽略返回值函数的注释(`@ discardableResult`).UIKit的只是没有应用该注解自己的API. (5认同)
  • 大家好消息!在Xcode 8.3中修复. (4认同)

Cod*_*per 38

当生活给你柠檬时,做一个扩展:

import UIKit

extension UINavigationController {
    func pop(animated: Bool) {
        _ = self.popViewController(animated: animated)
    }

    func popToRoot(animated: Bool) {
        _ = self.popToRootViewController(animated: animated)
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,添加类似的内容@discardableResult func pop(animated: Bool) -> UIViewController?会导致您尝试避免的相同警告.

通过扩展,您现在可以编写:

func exitViewController()
{
    navigationController?.pop(animated: true)
}

func popToTheRootOfNav() {
    navigationController?.popToRoot(animated: true)
}
Run Code Online (Sandbox Code Playgroud)

编辑:也添加了popToRoot.


Mat*_*man 24

在Swift 3中,忽略具有声明的返回值的函数的返回值会导致警告.

选择退出此方法的一种方法是使用@discardableResult属性标记函数.由于您无法控制此功能,因此无法使用.

摆脱警告的另一种方法是将值赋值给_.这告诉编译器您知道该方法返回一个值,但您不希望将其保留在内存中.

let _ = navigationController?.popViewController(animated: true)
Run Code Online (Sandbox Code Playgroud)

  • 我想我们还得坚持丑`_`直到苹果更新这个新属性的UIKit. (2认同)
  • 不幸的是`@ discardableResult`不起作用(至少它仍然与8b4呱呱叫).弗里德里希席勒喜欢腐烂的苹果.可能是味道问题:-( (2认同)

Jay*_*bey 5

截图1

虽然它work correctly if kept as it is但是number of warning increases.

解决方案replace it with underscore ( _ )虽然看起来很难看.

Eg.  _ = navigationController?.popViewController(animated: true)
Run Code Online (Sandbox Code Playgroud)

截图2