2016-10-02 26 views
3

我使用變量j打印延遲塊內其最終值,如下所示:如何避免Swift中的「變量j寫入,但從未讀過」?

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

所以,可變Ĵ確實讀取和印刷在延遲塊內。儘管如此,PlayGround仍顯示變量j被寫入但從未讀取的警告。有沒有一種方法來啓發編譯器並消除此警告?

回答

1

如果變量聲明高於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聲明,我認爲它應該。很好的發現。

+0

有沒有辦法給出一個「半滴答」標記這個答案,因爲它已經回答第一部分如果沒有其他答案,或者如果我的第二部分問題是Swift 3中的已知錯誤,我想將其轉換爲完整的勾號。 –

+0

這是一個很好的問題。如果它沒有幫助,請不要註冊你可以等待一個答案或者試試Swift論壇或者發佈一個bug報告,看看開發者說了些什麼,看起來像是一個bug,但是我不能告訴你fo當然。 –

+0

我已經等了四天,並將其作爲您所指定網站中的一個錯誤提交。我完全相信給你完整的刻度標記。 –

0

解決方法

添加一個匿名的分配,_ =,消除了警告:

// 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() 
+0

我的歉意。我無法理解你的評論「至於......石頭」。請解釋一下。 –

+0

雖然我不會在SO裏默認,但在我看來,當OP命名他的函數justForFun()時,他正在設置一個輕鬆的語氣。但輕鬆愉快!=令人困惑。我已經刪除了該行。 – AmitaiB