Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 代码8/Swift 3:;UIViewController类型的表达式?是未使用的“;警告_Ios_Swift - Fatal编程技术网

Ios 代码8/Swift 3:;UIViewController类型的表达式?是未使用的“;警告

Ios 代码8/Swift 3:;UIViewController类型的表达式?是未使用的“;警告,ios,swift,Ios,Swift,我有下面的函数,它以前编译得很干净,但是用Xcode 8生成了一个警告 func exitViewController() { navigationController?.popViewController(animated: true) } “UIViewController?”类型的表达式未使用 为什么会这样说?有没有办法消除它 代码按预期执行。TL;博士 popViewController(动画:)返回UIViewController?,编译器会发出警告,因为您没有捕获该值。解决

我有下面的函数,它以前编译得很干净,但是用Xcode 8生成了一个警告

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的动机:

  • 防止可能的错误(例如,使用
    排序
    认为它修改了集合)
  • 不捕获或需要捕获其他协作者的结果的明确意图
UIKit API似乎落后于此,没有添加
@discardableResult
,以便在不捕获返回值的情况下正常使用
popViewController(动画:)

阅读更多

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

选择退出的一种方法是使用
@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

根据,章节语言参考-属性

可丢弃结果

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

在《语言指南-方法》一章的《Swift编程语言》中也有一个演示

@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更新中肯定要修复的内容的最干净的修复。