Ios 代码8/Swift 3:;UIViewController类型的表达式?是未使用的“;警告
我有下面的函数,它以前编译得很干净,但是用Xcode 8生成了一个警告Ios 代码8/Swift 3:;UIViewController类型的表达式?是未使用的“;警告,ios,swift,Ios,Swift,我有下面的函数,它以前编译得很干净,但是用Xcode 8生成了一个警告 func exitViewController() { navigationController?.popViewController(animated: true) } “UIViewController?”类型的表达式未使用 为什么会这样说?有没有办法消除它 代码按预期执行。TL;博士 popViewController(动画:)返回UIViewController?,编译器会发出警告,因为您没有捕获该值。解决
func exitViewController()
{
navigationController?.popViewController(animated: true)
}
“UIViewController?”类型的表达式未使用
为什么会这样说?有没有办法消除它
代码按预期执行。TL;博士
popViewController(动画:)
返回UIViewController?
,编译器会发出警告,因为您没有捕获该值。解决方案是将其指定给下划线:
_ = navigationController?.popViewController(animated: true)
_ = someMethodThatReturnsSomething()
迅速的变化 在Swift 3之前,默认情况下,所有方法都有一个“可丢弃的结果”。如果未捕获方法返回的内容,则不会出现警告 为了告诉编译器应该捕获结果,您必须在方法声明之前添加
@warn\u unused\u result
。它将用于具有可变形式的方法(例如,sort
和sortInPlace
)。您可以添加@warn\u unused\u result(mutable\u variant=“mutableMethodHere”)
来告诉编译器
但是,使用Swift 3时,行为会发生翻转。现在,所有方法都警告未捕获返回值。如果要告诉编译器不需要警告,可以在方法声明之前添加@discardableResult
如果不想使用返回值,则必须通过将其指定给下划线来明确告诉编译器:
_ = navigationController?.popViewController(animated: true)
_ = someMethodThatReturnsSomething()
将此添加到Swift 3的动机:
- 防止可能的错误(例如,使用
排序
认为它修改了集合)
- 不捕获或需要捕获其他协作者的结果的明确意图
@discardableResult
,以便在不捕获返回值的情况下正常使用popViewController(动画:)
阅读更多
@discardableResult
属性标记函数。由于您无法控制此函数,因此无法工作
消除警告的另一种方法是将该值指定给\uuuu
。这告诉编译器您知道该方法返回一个值,但您不想将其保留在内存中
let _ = navigationController?.popViewController(animated: true)
当生活给你柠檬时,做一个延伸:
import UIKit
extension UINavigationController {
func pop(animated: Bool) {
_ = self.popViewController(animated: animated)
}
func popToRoot(animated: Bool) {
_ = self.popToRootViewController(animated: animated)
}
}
注意添加类似于@discardablesult func pop(动画:Bool)->UIViewController?
的内容将导致您试图避免的相同警告
使用扩展名,您现在可以编写:
func exitViewController()
{
navigationController?.pop(animated: true)
}
func popToTheRootOfNav() {
navigationController?.popToRoot(animated: true)
}
编辑:也添加了PoptRoot。
虽然如果保持原样,它可以正常工作,但警告的数量会增加。
解决方法是简单地用下划线(41;替换它,尽管它看起来很难看
Eg. _ = navigationController?.popViewController(animated: true)
另一种方法是,您可以打开
self.navigationController?
值并调用popViewController
函数
if let navigationController = navigationController {
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)
}
}
在此条件下使用discardableResult
根据@discardableResult
mutating func advance(to level: Int) -> Bool {
...
return true
}
因为调用advance(to:)方法忽略返回值的代码不一定是错误的,所以此函数用@discardableResult属性标记。有关此属性的详细信息,请参见属性
这(在我看来)绝对是对Swift 2的倒退,特别是当有这样的方法时,即使它们返回值,也有完全有效的用例,您只是不使用它。1。你不需要
let
:你可以直接分配给u,而不必在前面加上let
或var
。@rickster不知道这会增加答案。2@尼古拉斯米亚利。对于确实返回值但可能忽略返回值的函数,有一个注释(@discardableResult
)。UIKit只是没有将注释应用到他们的API中。这是可怕的语法。他们为什么要这样做?糟糕。我想在苹果用这个新属性更新UIKit之前,我们必须坚持使用丑陋的。@discardableResult
不起作用(至少它仍然使用8b4)。弗里德里希·席勒喜欢烂苹果。可能是口味的问题:-(这应该是公认的解决方案,因为它是对Xcode更新中肯定要修复的内容的最干净的修复。