如何在Swift中避免"Variable j written into, but never read"?

How to avoid "Variable j written into, but never read" in Swift?

我正在使用变量 j 在延迟块中打印其最终值,如下所示:

func justForFun()
{    
   defer {let x = j; print("\(x)")}
   var j = 0
   for i in 1...5
   {
       print("\(i)")
       j = i*2;
   }
}
justForFun()

因此,变量 j 确实在 defer 块中被读取和打印。尽管如此,PlayGround 仍会显示 变量 j 已写入但从未读取 的警告。有没有办法启发编译器并消除此警告?

如果将变量声明移到 defer 上方,则警告消失。

$ cat d.swift 
func justForFun() {    
   var j = 0
   defer {let x = j; print("\(x)")}
   for i in 1...5 {
       print("\(i)")
       j = i*2;
   }
}
justForFun()

$ swift d.swift 
1 
2
3
4
5
10

虽然这不能解释为什么 会出现警告,但它确实回答了如何使警告消失。

就启发编译器而言,我认为您做不到。您可能想在 swift.org 提交和签发;请参阅 this page 了解如何报告错误。似乎静态流检查器没有查看 defer 语句,我认为它应该查看。好发现。

解决方法

添加匿名分配,_ = ,消除警告:

// Swift 3.0
func justForFun()
{
  defer {let x = j; print("\(x)")}
  var j = 0

  // anonymous assignment:
  _ = j
  for i in 1...5
  {
    print("\(i)")
    j = i*2;
  }
}

justForFun()