当前位置: 首页 > 面试题库 >

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

凌啸
2023-03-14
问题内容

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

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

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

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

该代码将按预期执行。


问题答案:

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:)而没有捕获返回值。

阅读更多

  • SE-0047 Swift Evolution提案
  • 接受的建议书有修订


 类似资料:
  • 问题内容: 仅供参考:我是Swift的新手,所以这可能是一个非常简单的问题,但我 无法弄清楚。 我一直在关注 使用Xcode 8 beta和Swift 3 的《开始开发iOS应用程序 (Swift) 教程》。 我将Tap Gesture Recognizer附加到了Image View,然后 在ViewController.swift中添加了此操作: 在图像 视图上轻按以调用selectImage

  • 如果我以通常的方式声明一个类,我可以使用类名作为类型: 但是,如果我通过将类表达式分配给变量来声明一个类,我就不能将该名称用作类型: 建议使用不起作用,因为我想要的实例类型,而不是类本身的类型。 typescript操场示例 如何获取以第二种方式定义的类的实例类型? 我对以这种方式定义类感兴趣的原因是,我希望有一个接口来描述某些类将具有的静态方法,如此处的手册中所述(该部分中的第三个示例)。 下面

  • 假设我有一个map。现在我只想从中获取条目并创建一个新的map与这些条目。 我正在尝试做以下事情: 这似乎可行,但我得到了一个警告:类型模式(String,Int)中的非变量类型参数字符串未选中,因为它已被擦除消除。 我怎样才能摆脱警告?

  • #include <stdio.h> union Type { int a; int *b; }; int main() { printf("sizeof(union Type) is %lu\n", sizeof(union Type)); return 0; } 技巧 使用gcc -g编译生成的程序,是不包含union Type的符号信息: (gdb) p sizeof(

  • 问题内容: 给这个: [未检查]未检查的方法调用:java.lang.Enum中的valueOf(java.lang.Class,java.lang.String)应用于(java.lang.Class,java.lang.String) 我不想使用泛型,因为这是一个重大更改。我不想压抑。我不明白为什么会发生此警告。我想这是因为无法扩展Enum类型。我明白了。但是我不明白为什么通配符类会抛出这个奇

  • 问题内容: 我正在写一个堆栈,其中一个带有静态Node,另一个非静态。 但是,当我尝试使节点变为非静态时,它会发出以下警告:“类型参数E隐藏了类型E” 我已经告诉我一些理解,因为静态成员是类的成员,所以它不会给我警告,但是当我将其设为非静态时,它属于实例。但这不是一个清晰的想法。 问题答案: 这是警告您,已经在作用域中使用了通用参数名称。更改的通用参数名称将是解决警告的一种方法: 但是由于E已经存