我得到了下面的函数,之前编译干净,但用Xcode 8生成了一个警告。
func exitViewController()
{
navigationController?.popViewController(animated: true)
}
类型为“UIViewController?”的表达式未使用。
它为什么这么说,有办法去掉它吗?
代码按预期执行。
我得到了下面的函数,之前编译干净,但用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)