一尘不染

Xcode 8 / Swift 3:“ UIViewController类型的表达吗?未使用”警告

swift

我有以下函数,该函数以前已经进行了干净的编译,但是使用Xcode 8会生成警告。

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

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

为什么这么说,有没有办法将其删除?

该代码将按预期执行。


阅读 209

收藏
2020-07-07

共1个答案

一尘不染

TL; DR

popViewController(animated:)返回UIViewController?,由于您没有捕获该值,编译器会发出警告。解决方案是将其分配给下划线:

_ = navigationController?.popViewController(animated: true)

迅捷3变更

在Swift 3之前,所有方法默认都具有“可丢弃的结果”。当您没有捕获该方法返回的内容时,将不会发生任何警告。

为了告诉编译器应该捕获结果,您必须@warn_unused_result在方法声明之前添加。它可用于具有可变形式(例如sortsortInPlace)的方法。您将添加内容@warn_unused_result(mutable_variant="mutableMethodHere")以告知编译器。

但是,在Swift
3中,行为被翻转了。现在,所有方法都会警告未捕获返回值。如果要告诉编译器警告是不必要的,请@discardableResult在方法声明之前添加。

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

_ = someMethodThatReturnsSomething()

将其添加到Swift 3的动机:

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

UIKit
API似乎落后于此,没有添加@discardableResult完全正常的(如果不是更常见的)用法,popViewController(animated:)而没有捕获返回值。

阅读更多

2020-07-07