首页 » iOS编程基础:Swift、Xcode和Cocoa入门指南 » iOS编程基础:Swift、Xcode和Cocoa入门指南全文在线阅读

《iOS编程基础:Swift、Xcode和Cocoa入门指南》3.1 变量作用域与生命周期

关灯直达底部

回忆一下第1章所讲的,变量就是个类型明确的具名盒子。每个变量都必须要显式声明。为了将对象放到盒子中,即让变量名引用该对象,你需要将对象赋给变量(第2章介绍过,函数也有类型,也可以赋给变量)。

除了给引用赋予一个名字,根据所声明的位置,变量还会对所引用的对象赋予一个特定的作用域(可见性)与生命周期;将某个对象赋给变量可以确保它能被所需的代码看到,并且持续足够长的时间来满足这个目的。

在Swift文件的结构中(参见示例1-1),变量实际上可以在任何地方声明。不过,区分变量作用域与生命周期的几个层次还是非常有必要的:

全局变量

全局变量指的是声明在Swift文件顶层的变量(在示例1-1中,变量one就是个全局变量)。

全局变量的生命周期与文件一样长。这意味着它会一直存在。不过,说一直存在有点不太严格,但只要程序运行时它就会存在。

全局变量在任何地方都是可见的,这正是“全局”一词的含义。相同文件中的所有代码都可以看到它;因为它位于顶层,因此相同文件中的任何其他代码都会位于顶层或是更低的层次,这都是作用域所包含的层次。此外,在默认情况下,相同模块中的任何其他文件中的代码也可以看到它,因为同一个模块中的Swift文件会自动看到彼此,因此也会看到彼此的顶层内容。

属性

属性指的是声明在对象类型声明(枚举、结构体或类;在示例1-1中,3个name变量就是属性)顶层的变量。有两种类型的属性:实例属性与静态/类属性。

实例属性

在默认情况下,属性就是实例属性。其值对于该对象类型的每个实例来说都是不同的;其生命周期与实例的生命周期相同。回忆一下第1章,实例创建后(通过实例化)就存在了;实例随后的生命周期取决于该实例所赋予的变量的生命周期。

静态/类属性

通过关键字static或class声明的属性就是静态/类属性(第4章将会对其进行详细介绍)。其生命周期与对象类型的生命周期相同。如果对象类型声明在文件顶层,或是声明在另一个对象类型的顶层,而该对象类型又声明在顶层,那么这就意味着它会一直存在(只要程序运行就会存在)。

属性对于对象声明中的所有代码都是可见的。比如,对象的方法可以看到该对象的属性。代码可以通过self加上点符号来引用属性,我总是这样做,不过除了一些可能会产生歧义的场景,通常可以省略掉。

在默认情况下,实例属性对于其他代码也是可见的,前提是其他代码持有该实例的引用;在这种情况下,可以通过实例引用与点符号来引用属性。在默认情况下,静态/类属性对于其他代码也是可见的,只要其他代码能够看到该对象类型的名字即可;在这种情况下,可以通过对象类型与点符号来引用属性。

局部变量

局部变量指的是声明在函数体中的变量(在示例1-1中,变量two就是个局部变量)。局部变量的生命周期取决于外围花括号的生命周期:当执行路径进入作用域中并到达变量声明处时,局部变量就产生了;当执行路径退出作用域时,局部变量就会消亡。局部变量有时也叫作自动变量,表示它们会自动产生和消亡。

局部变量只能被相同作用域的后续代码看到(包括相同作用域中后续更深层次的代码)。