我得到了下面的函数,之前编译干净,但用Xcode 8生成了一个警告。

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

类型为“UIViewController?”的表达式未使用。

它为什么这么说,有办法去掉它吗?

代码按预期执行。


当前回答

在这种情况下使用discardableResult。

参考《Swift Programming Language >》,章节语言参考-属性。

discardableResult 将此属性应用于函数或方法声明,可在调用返回值的函数或方法而不使用其结果时抑制编译器警告。

在< Swift Programming Language >,章节语言指南-方法中也有一个演示。

@discardableResult
mutating func advance(to level: Int) -> Bool {
    ...
    return true
}

因为调用advance(to:)方法忽略返回值并不一定是错误,所以这个函数用@discardableResult属性标记。有关此属性的更多信息,请参见属性。

其他回答

在这种情况下使用discardableResult。

参考《Swift Programming Language >》,章节语言参考-属性。

discardableResult 将此属性应用于函数或方法声明,可在调用返回值的函数或方法而不使用其结果时抑制编译器警告。

在< Swift Programming Language >,章节语言指南-方法中也有一个演示。

@discardableResult
mutating func advance(to level: Int) -> Bool {
    ...
    return true
}

因为调用advance(to:)方法忽略返回值并不一定是错误,所以这个函数用@discardableResult属性标记。有关此属性的更多信息,请参见属性。

当生活给你柠檬的时候,延伸一下:

import UIKit

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

    func popToRoot(animated: Bool) {
        _ = self.popToRootViewController(animated: animated)
    }
}

注意,添加一些像@discardableResult func pop(animated: Bool) -> UIViewController?将导致你试图避免的同样的警告。

有了扩展,你现在可以写:

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

func popToTheRootOfNav() {
    navigationController?.popToRoot(animated: true)
}

编辑:也添加了popToRoot。

在Swift 3中,忽略已声明返回值的函数的返回值将导致警告。

选择不这样做的一种方法是使用@discardableResult属性标记函数。因为你不能控制这个函数,所以这行不通。

消除警告的另一种方法是将值赋值为_。这告诉编译器你知道这个方法返回一个值,但是你不想把它保留在内存中。

let _ = navigationController?.popViewController(animated: true)

如果你想要像CodeReaper的答案一样扩展,你应该使用@descardableResult。这保留了所有的可能性,但消除了警告。

import UIKit

extension UINavigationController {
    @discardableResult func pop(animated: Bool) -> UIViewController? {
        return self.popViewController(animated: animated)
    }

    @discardableResult func popToRoot(animated: Bool) -> [UIViewController]? {
        return self.popToRootViewController(animated: animated)
    }
}

虽然如果保持原样,它可以正常工作,但警告的数量会增加。

解决方案是简单地用下划线(_)替换它,尽管它看起来很难看。

Eg.  _ = navigationController?.popViewController(animated: true)