如何避免"变量j写入,但从未读过"在斯威夫特?

时间:2016-10-02 07:15:12

标签: 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 。尽管如此,PlayGround还是会显示变量j被写入但从未读过的警告。有没有办法启发编译器并消除此警告?

2 个答案:

答案 0 :(得分:2)

如果变量声明移到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语句,我相信它应该是。很好找。

答案 1 :(得分:1)

解决方法

添加匿名作业// 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() 会消除警告:

<script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=(Paste YOUR API KEY)"></script>