Swift 2:不可变值X从未使用,考虑替换为“_”。

40

在我的一些旧代码中,我遇到了警告:

不可变值 X 从未被使用,请考虑替换为“_”

例如,在检查具有关联对象的枚举(但在此情况下我不使用该对象)或者使用 'If let' 结构来检查对象是否为 nil 的情况下,这种警告经常发生。

我不太介意浏览这些警告并进行更改,但我想知道是否有人知道为什么建议这样做-为什么要警告我们?这会影响性能吗?


这只是Xcode的预防措施。 - jbrahy
5个回答

37

推荐进行这些更改,因为如果您完全不使用这些变量,应该考虑将其替换为“_”。 这样您(和其他人)以后可以更快地理解您的意图。

从性能上讲,这可能只是微小的改进,您几乎无法注意到。同样的情况也适用于编译和优化您的代码。


嗨Qbyte,你有苹果公司关于这个案例的文档吗? - lee
很遗憾,不是这样的。但我相当确定第一种情况是正确的,因为编译器是这么建议的。就性能而言,我可以想象即使你保留变量,结果也会被优化掉。 - Qbyte

25

不可变值X从未被使用,考虑替换为“_”

出现这个警告是因为你在声明变量后没有使用它。可以忽略警告并继续编写代码并使用对象,它将消失。

Swift 2是一种非常敏感的语言,它会在每一步都给你警告。

我在这里解释一个任何对象警告的简单演示:- 1.不可变值X从未被使用,考虑替换为“_” 当你只声明对象而不使用它时,就会出现这种情况。 例如:

var nameImg:String = "";

2. 变量'nameImg'已被定义但未被使用。 当您给对象分配任何值时,它将出现,但您仍未在任何其他对象中使用它。 例如-

  var nameImg:String = "";
                    if(action==1){
                        nameImg  = "navTab";
                    }
                    else{
                        nameImg  = "back";
                    }

3. 没有警告会出现,如果您将任何值分配给对象并在另一个对象中使用它 ;).

例如-

 var nameImg:String = "";
                    if(action==1){
                        nameImg  = "navTab";
                    }
                    else{
                        nameImg  = "back";
                    }


                    //back & menu btn
                    let btnBack = UIButton(type: UIButtonType.Custom);
                    btnBack.setImage(UIImage(named:nameImg), forState: UIControlState.Normal);
                    btnBack.sizeToFit();

为什么我们要在另一个对象中声明对象?如果我们不想使用它,为什么会出现警告?这是编程语言的错误吗?我只需要这一行代码:let stingname: String = objectfile.name,但它给了我一个警告,为什么?如果我在print语句中使用它,那么就不会有任何警告...为什么? - Akash Raghani
let stingname: String = objectfile.name 这意味着Swift正在通过警告或提醒帮助您,因为它仍未在我们的项目中使用。请立即使用它 :) 当您打印(print("str(stingname)"))时,你已经在使用它了,并且警告消失了。所以对于iOS开发人员来说,Swift非常好用,因为它通过黄色的警告在任何情况下都能帮助我们。我们只需要认真阅读并喜欢它们有用的含义。最好的问候 - Abhimanyu Rathore
�,它是在说无论你在 Swift 中创建什么对象,都应该使用它们,其他的对象都没用。😉 - Abhimanyu Rathore

2

这是因为在声明变量后,您从未使用过它。我不久前也遇到了完全相同的问题。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)


    let row = indexPath.row <-----

我发现在之后打印它可以消除错误。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)


    let row = indexPath.row <---
    print(row) <---

1
如果您只是声明一个值来存储需要维持函数调用生命周期的强引用,那么这个解决方案是很好的。我只在测试中这样做,但有时这正是我需要的。如果某些东西具有您想要触发的副作用,但没有可丢弃的返回结果类型,则分配给_更好。 - moger777

1
通常,您应该在日常工作中无警告地工作。显而易见的原因是,如果您的代码产生数百个不那么重要的警告,那么您将错过真正重要的警告。
解决您所描述的情况的最佳方法是:不要使用“if let myObject = myObject”,而应该使用:
if myObject != nil 

以这种方式,你想要做什么就很清楚了。

-1

这个警告出现是因为Xcode希望你改变变量。Xcode希望这个变量没有被使用。希望这可以帮到你。一旦你使用它,错误就会消失。我已经反复尝试过这个方法,并进行了研究,事实上每次都会消失。


欢迎来到StackOverflow,如果需要更好地理解答案,请添加一些描述和代码,因为这将尽快解决其他人的问题。 - Nensi Kasundra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接