如何在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()
我正在使用变量 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()