2016-04-26 185 views
5

鑑於此示例銀行代碼:訪問全局變量斯威夫特

var a = 10; 

func foo() -> Int { 
    var a = 20; 
    return a; 
} 

如何函數foo可以訪問全局變量值爲10,而不是與值20的一個地方?

請注意,a和foo都不是在類中聲明的,而是在通用模塊中聲明的。我正在尋找一種方法來告訴Swift訪問全局定義的變量,而不是本地定義的變量。

+0

var a和function foo沒有在類中聲明,而是在模塊中聲明。 – Marco

+1

什麼是模塊命名?我認爲你可以通過調用'Module.a'來完成,但還沒有嘗試過。 https://www.reddit.com/r/swift/comments/3xd560/scoperesolution_operator/ –

+1

此外,@Marco,你可以編輯你的問題,包括你在評論中提供的信息?我認爲大多數Swift開發人員會認爲我們在沒有任何信息的情況下在課堂上工作。 –

回答

3

我在Xcode中,一個控制檯應用程序創建了一個項目,目標是在這裏的模塊。 因此,我將該項目命名爲test,並且目標名稱與項目名稱相同,因此該模塊本身也有名稱test。任何全局定義都將暗含對test.的調用。就像全球Swift函數隱含了對Swift.的調用,如Swift.print("...")

var a = 10; 

func foo() -> Int { 
    let a = 20; 
    Swift.print(test.a) // same as print(test.a) 

    return a; 
} 

test.foo() // same as foo() 

輸出是:


所以,你必須在變量之前添加模塊名稱,以獲得全球性的,而不是當地的一個掩蓋它。

2

使用self關鍵字:

func foo() -> Int { 
    var a = 20; 
    return self.a; 
} 
+0

foo不是定義成類的方法,它是一個函數,所以self不可用。 – Marco

+0

如果var a = 10,該怎麼辦?是不是在同一班?您將不會遇到任何成員錯誤。 – 2016-04-26 07:37:51

2
func foo(bar:Any) -> Int { 
     let a = 20 
     if bar is Bar { 
      let c = bar as? Bar 
      return c!.a 
     } 
     return a 
    } 
+1

你應該做'如果讓c =吧?酒吧'而不是強制鑄造。 – EmilioPelaez