Swift基础语法: 27 - Swift的全局变量和局部变量, 类型属性, 获取和设置类型属性的值

前面我们基本上把Swift的基本内容过了一边, 但这并不足以让我们在开发中良好的运用, 现在让我们继续来往下学习吧:


1.全局变量和局部变量

在前面我们讲解了计算属性和属性监视器, 它们所描述的模式也是可以用于全局变量和局部变量, 所谓的全局变量和局部变量其实是和OC中里的一致, 没有多大区别,

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

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

PS: 全局的常量或变量都是延迟计算的, 跟延迟存储属性相似, 不同的地方在于, 全局的常量或变量不需要标记 lazy 特性; 局部范围的常量或变量不会延迟计算。


2.类型属性

在我们实际开发中, 实例的属性是属于特殊的类型属性, 同时也可以为类型本身定义属性, 不管类型有多少个实例,这些属性都只有唯一一份, 这种属性就是类型属性。

类型属性用于定义特定类型所有实例共享的数据,比如所有实例都能用的一个常量, 或者所有实例都能访问的一个变量.

对于值类型(指结构体和枚举)可以定义存储型和计算型类型属性, 对于类(class)则只能定义计算型类型属性, 值类型的存储型类型属性可以是变量或常量, 计算型类型属性跟实例的计算属性一样定义成变量属性.

PS: 跟实例的存储属性不同,必须给存储型类型属性指定默认值,因为类型本身无法在初始化过程中使用构造器给类型属性赋值。


3.类型属性语法

在 C 或 Objective-C 中, 静态常量和静态变量的定义是通过特定类型加上 global 关键字, 在 Swift 编程语言中, 类型属性是作为类型定义的一部分写在类型最外层的花括号内, 因此它的作用范围也就在类型支持的范围内.

使用关键字 static 来定义值类型的类型属性,关键字 class 来为类(class)定义类型属性, 比如:

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}

enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 2
    }
}

class SomeClass {
    class var computedTypeProperty: Int {
        return 3
    }
}

PS: 例子中的计算型类型属性是只读的, 但也可以定义可读可写的计算型类型属性, 跟实例计算属性的语法类似.


4.获取和设置类型属性的值

在上面的例子, 我们是定义好了属性, 如果我们要取里面的属性, 是和我们在实例的时候一致的, 比如:

println(SomeClass.computedTypeProperty)
// 打印出来的结果: 3

println(SomeStructure.storedTypeProperty)
// 打印出来的结果: Some value.

SomeStructure.storedTypeProperty = "Another value."
println(SomeStructure.storedTypeProperty)
// 打印出来的结果: Another value.

这样子我们就可以访问类型中的属性了, 还有另外一个例子, 让我们来看看:
例子


struct AudioChannel {
    static let thresholdLevel = 10
    static var maxInputLevelForAllChannels = 0

    var currentLevel: Int = 0 {
    didSet {
        if currentLevel > AudioChannel.thresholdLevel {
            // 将新电平值设置为阀值
            currentLevel = AudioChannel.thresholdLevel
        }
        if currentLevel > AudioChannel.maxInputLevelForAllChannels {
            // 存储当前电平值作为新的最大输入电平
            AudioChannel.maxInputLevelForAllChannels = currentLevel
        }
    }
    }
}

var leftChannel = AudioChannel()
var rightChannel = AudioChannel()

leftChannel.currentLevel = 7

println(leftChannel.currentLevel)
// 打印出来的结果: 7
println(AudioChannel.maxInputLevelForAllChannels)
// 打印出来的结果: 7

rightChannel.currentLevel = 11

println(rightChannel.currentLevel)
// 打印出来的结果: 10
println(AudioChannel.maxInputLevelForAllChannels)
// 打印出来的结果: 10

PS: 由于上面做了个限制, 该电频最高就只能到达10, 所以一旦你输入大于10的数, 这里都会默认输出10.


好了, 这次我们就讲到这里, 下次我们继续~

posted @ 2015-03-17 23:20  背着吉他去流浪  阅读(1712)  评论(0编辑  收藏  举报