在Swift程序中,一切事物都有作用域。这指的是它们会被其他事物看到的能力。一个事物可以嵌套在其他事物中,形成一个嵌套的层次结构。规则是一个事物可以看到与自己相同层次或是更高层次的事物。层次有:
·模块是一个作用域。
·文件是一个作用域。
·对象声明是一个作用域。
·花括号是一个作用域。
在声明某个事物时,它实际上是在该层级的某个层次上进行的声明。它在层级中的位置(即作用域)决定了是否能被其他事物看到。
再来看看示例1-1。在Manny的声明中是个name变量声明和一个sayName函数声明;sayName花括号中的代码可以看到更高层次中花括号之外的内容,因此它可以看到name变量。与之类似,changeOne函数体中的代码可以看到文件顶层所声明的one变量;实际上,该文件中的一切事物都可以看到文件顶层所声明的one变量。
作用域是共享信息的一种非常重要的手段。声明在Manny中的两个不同函数都会看到在Manny顶层所声明的name变量。Jack中的代码与Moe中的代码都可以看到声明在文件顶层的one。
事物还有生命周期,这与其作用域是相关的。一个事物的生命周期与其外部作用域的生命周期是一致的。因此,在示例1-1中,变量one的生命周期就与文件一样,只要程序处于运行状态,one就是有效的。它是全局且持久的。不过,声明在Manny顶层的变量name只有在Manny存在时才存在(稍后将会对此做出说明)。声明在更深层次中的事物的生命周期会更短;比如,看看下面这段代码:
func silly { if true { class Cat {} var one = 1 one = one + 1 }}
在上述代码中,类Cat与变量one只在代码执行路径通过if结构这一短暂的时间内才会存在。当调用函数silly时,执行路径就会进入if结构中,Cat会被声明并进入存活状态;接下来,one被声明并进入存活状态;然后代码行one=one+1会被执行;接下来作用域结束,Cat与one都会消失殆尽。