2016-04-26 120 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