我有以下函数,之前编译时一切正常,但在Xcode 8中会生成警告。
func exitViewController()
{
navigationController?.popViewController(animated: true)
}
“Expression of type "UIViewController?" is unused”。
为什么会出现这种提示,是否有方法可以去除它?
代码的执行符合预期。
popViewController(animated:)
方法返回 UIViewController?
类型,编译器因为你没有捕获该值而发出警告。解决方法是将其赋值给下划线:
_ = navigationController?.popViewController(animated: true)
在Swift 3之前,默认情况下所有方法都有一个“可丢弃的结果”。当您没有捕获方法返回值时,不会发出任何警告。
为了告诉编译器结果应该被捕获,您必须在方法声明之前添加@warn_unused_result
。它将用于具有可变形式的方法(例如sort
和sortInPlace
)。您可以添加@warn_unused_result(mutable_variant="mutableMethodHere")
来告诉编译器这一点。
然而,在Swift 3中,行为被颠倒了。现在所有方法都会警告返回值未被捕获。如果想要告诉编译器不需要警告,请在方法声明之前添加 @discardableResult
。
如果您不想使用返回值,您必须显式地通过将其赋值给下划线来告诉编译器:
_ = someMethodThatReturnsSomething()
添加此功能到Swift 3的动机:
sort
时认为它修改了集合)看起来UIKit API落后于此,没有为popViewController(animated:)
正常(如果不是更常见的话)的用途添加@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。
@discardableResult
属性标记该函数。由于您无法控制此函数,因此该方法不适用。
另一种消除警告的方法是将其赋值给_
。这告诉编译器您知道该方法返回一个值,但您不希望将其保留在内存中。let _ = navigationController?.popViewController(animated: true)
@discardableResult
不起作用(至少在 8b4 中仍然会出错)。弗里德里希·席勒喜欢烂苹果。可能只是个人口味问题 :-( - qwerty_so还有一个演示在<Swift编程语言>,第15章 - 方法。discardableResult
将此属性应用于函数或方法声明,以抑制编译器警告,当调用返回值的函数或方法时,如果不使用其结果,则会出现警告。
@discardableResult
mutating func advance(to level: Int) -> Bool {
...
return true
}
@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)
}
}
self.navigationController?
值并调用popViewController
函数。if let navigationController = navigationController {
navigationController.popViewController(animated: true)
}
let
,你可以直接给 _ 赋值,无需在之前加上let
或var
。 - rickster@discardableResult
的注释是用于标识那些虽然返回值但是可以忽略其返回值的函数。但是,UIKit尚未将该注释应用于其API中。 - rickster