Swift教程之属性详解

2020-01-08 22:50:59于丽

// prints "Another value.

 

下面的例子在一个结构中使用两个存储类型属性来展示一组声音通道的音频等级表。每个通道使用0到10来表示声音的等级。

从下面的图表中可以看出,使用了两组声音通道来表示一个立体声音频等级表。当一个通道的等级为0时,所有的灯都不会亮,当等级为10时,所有的灯都会亮。下面的图中,左边的通道表示声音等级为9,右边的为7

Swift教程之属性详解

上述的声音通道由以下的AudioChannel结构实例来表示:

 

复制代码
struct AudioChannel {
static let thresholdLevel = 10
static var maxInputLevelForAllChannels = 0
var currentLevel: Int = 0 {
didSet {
if currentLevel > AudioChannel.thresholdLevel {
//cap the new audio level to the threshold level
currentLevel = AudioChannel.thresholdLevel
}
if currentLevel > AudioChannel.maxInputLevelForAllChannels {
// store this as the new overall maximum input level
AudioChannel.maxInputLevelForAllChannels = currentLevel
}
}
}
}

 

AudioChannel结构定义了两个存储类型属性。thresholdLevel定义了音频所能达到的最高等级,对所有的AudoChannel实例而言,是个值为10的常量。当一个声音信号的值超过10时,会被截断为其阈值10。

第二个类型属性是一个变量存储属性maxInputLevelForAllChannels。它保存了当前所有AudioChannel实例中所接受到声音的最高等级,它被初始化为0。

结构还定义了一个存储实例属性currentLevel,表示当前的通道声音等级。这个属性使用didSet属性观察者来检测currentLevel的改变。这个观察者执行两道检查:

如果currentlevel的新值比阈值thresholdLevel大,currentLevel将被设置成thresholdLevel
如果currentLevel的新值比所有AudioChannel实例之前接受到的最大声音等级还要大,那么maxInputLevelForAllChannles将会被设置成cueentLevel大值。

注意

第一道检查中,didSet为currentLevel设置了新值。这并不会造成观察者再次被调用