Swift3 如何避免;变量j写入,但从不读取";斯威夫特?

Swift3 如何避免;变量j写入,但从不读取";斯威夫特?,swift3,swift-playground,Swift3,Swift Playground,我使用变量j在一个延迟块内打印其最终值,如下所示: func justForFun() { defer {let x = j; print("\(x)")} var j = 0 for i in 1...5 { print("\(i)") j = i*2; } } justForFun() 因此,变量j实际上是在延迟块内读取和打印的。尽管如此,游乐场仍会显示警告,提示已写入变量j,但从未读取。是否有办法启发编译器并消除此警告?如

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

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

因此,变量j实际上是在延迟块内读取和打印的。尽管如此,游乐场仍会显示警告,提示已写入变量j,但从未读取。是否有办法启发编译器并消除此警告?

如果将变量声明移到
延迟
上方,警告将消失

$ 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上提交和发布;有关如何报告错误的信息,请参阅。静态流检查器似乎没有查看
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()

有没有办法打个“半勾”“注意这个答案,因为它已经回答了我问题的第一部分?如果没有其他答案,或者如果我的问题的第二部分是Swift 3中的已知错误,我想将此转换为完整的勾号。这是一个好问题。如果这对你没有帮助,就不要投票。你可以等待答案,或者尝试Swift论坛,或者发布错误报告,看看开发人员怎么说。在我看来,这是一个bug,但我不能肯定地告诉你。我已经等了四天,并将此作为bug提交到你指定的站点。我完全相信给你打满分。我希望你能找到答案。这是一个有趣的案例。如果Swift采用的规则是局部的范围从声明点扩展到块的末尾,那么我会预料到编译器错误,即在
defer
块中使用
j
不在范围内。发生警告的事实很奇怪,我很抱歉。我无法理解你的评论“至于……石头”。请解释一下。虽然我并不默认这样轻率,但在我看来,当OP将他的函数命名为
justForFun()
时,他设置了一个轻松的基调。但是很轻松!=令人困惑我已经删除了那条线。