11.5. 全局变量和局部变量

计算属性和观察属性所描述的功能也可以用于全局变量局部变量。全局变量是在函数、方法、闭包或任何类型之外定义的变量。局部变量是在函数、方法或闭包内部定义的变量。

前面章节提到的全局或局部变量都属于存储型变量,跟存储属性类似,它为特定类型的值提供存储空间,并允许读取和写入。

另外,在全局或局部范围都可以定义*计算型变量*和为存储型变量定义观察器。计算型变量跟计算属性一样,返回一个计算结果而不是存储值,声明格式也完全一样。

注意

全局的常量或变量都是延迟计算的,跟 延时加载存储属性 相似,不同的地方在于,全局的常量或变量不需要标记 lazy 修饰符。

局部范围的常量和变量从不延迟计算。

可以在局部存储型变量上使用属性包装器,但不能在全局变量或者计算型变量上使用。比如下面的代码,myNumber 使用 SmallNumber 作为属性包装器。

func someFunction() {
    @SmallNumber var myNumber: Int = 0
    myNumber = 10
    // 这时 myNumber 是 10
    myNumber = 24
    // 这时 myNumber 是 12
}

就像将 SmallNumber 应用到属性上一样,将 myNumber 赋值为 10 是有效的。而因为这个属性包装器不允许值大于 12,将 myNumber 赋值为 24 时则会变成 12。