【问题标题】:Why use a wildcard (_) in Swift? [closed]为什么在 Swift 中使用通配符 (_)? [关闭]
【发布时间】:2016-10-07 17:41:55
【问题描述】:

浏览 Apple 的 Swift 文档,我设计了一个 for 循环,它创建 5 个按钮来充当 5 星评级功能中的“星”。

我注意到for循环的构造如下:

for _ in 0...<5 

在对此的解释中,Apple 提到当您不需要知道当前正在执行哪个循环迭代时,您可以使用通配符 _ 运算符。

但是不知道迭代有什么好处呢?是内存节省问题优化吗?有没有你不想知道迭代的场景?

【问题讨论】:

  • 如果您只是想多次运行某些东西? (有时会发生)

标签: swift for-loop iterator wildcard operator-keyword


【解决方案1】:

一般来说,未使用的变量会给代码增加语义开销。当有人阅读你的代码时,他们需要努力理解每一行和标识符的功能,以便他们能够准确预测更改代码的影响。通配符运算符允许您传达语言语法所需的值与后面的代码无关(事实上,甚至没有被引用)。

在您的具体示例中,循环可能需要执行一定次数,但如果您想在每次迭代中完全相同执行相同的操作,则迭代次数无关紧要。这不是特别常见,但确实会发生。在这种情况下,语义开销很低,但很有意义(你从一开始就明确表示你打算每次都做同样的事情),而且从广义上讲,这是一个好习惯。

【讨论】:

    【解决方案2】:

    for 循环索引需要存储在内存中,因此这不会作为任何类型的内存优化。

    我认为最重要的是它很容易向代码的读者传达循环索引并不重要。

    此外,它还可以防止您想出一些任意的虚拟变量名称。当您在循环中进行调试时,它还会整理您的名称空间,因为您不会看到这个虚拟变量。

    【讨论】:

      【解决方案3】:

      有没有你不想知道迭代的场景?

      当然。考虑:

      func echo(_ s:String, times:Int) -> String {
          var result = ""
          for _ in 1...times { result += s }
          return result
      }
      

      会怎么写?

      【讨论】:

      • Repeat(count: times, repeatedValue: s).joinWithSeparator("") (SCNR :)
      • @MartinR Sssssssh! :)
      • (0..&lt;times).reduce("") { (r, _) in r + s } 怎么样,它演示了_ 的另一种用法。
      • @vacawama 让我想起了在flatten 存在之前我是如何使用reduce 的!
      • @matt,为什么_ 是第一个参数?这不是默认行为吗?
      【解决方案4】:

      这不一定是要知道迭代。当您不需要知道循环内的元素时,您正在迭代。下划线是占位符 - 就像下划线是声明中抑制名称外部化的符号一样。请查看this SO Thread 了解更多详情。

      【讨论】:

      • 感谢其他线程的链接。
      猜你喜欢
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多