上述用于计算和观察属性的能力也可用于全局变量和局部变量。 全局变量是在任何函数,方法,闭包或类型上下文之外定义的变量。 局部变量是在函数,方法或闭包上下文中定义的变量。
在前面的章节中遇到的全局变量和局部变量都是存储的变量。 存储的变量(如存储的属性)为某种类型的值提供存储,并允许设置和检索该值。
但是,也可以在全局或局部范围中定义计算变量并定义存储变量的观察器。 计算变量计算它们的值,而不是存储它们,并且它们以与计算属性相同的方式写入。
类型属性的语法
在C和Objective-C中,您将与类型相关联的静态常量和变量定义为全局静态变量。 然而,在Swift中,类型属性被写为类型定义的一部分,在类型的外花括号中,每个type属性被显式地限定为它支持的类型。
使用static关键字定义类型属性。 对于类类型的计算类型属性,您可以使用类关键字来允许子类覆盖超类的实现。 下面的示例显示了存储和计算类型属性的语法:
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 6
}
}
class SomeClass {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 27
}
class var overrideableComputedTypeProperty: Int {
return 107
}
}
查询和设置类型属性
print(SomeStructure.storedTypeProperty)
// Prints "Some value."
SomeStructure.storedTypeProperty = "Another value."
print(SomeStructure.storedTypeProperty)
// Prints "Another value."
print(SomeEnumeration.computedTypeProperty)
// Prints "6"
print(SomeClass.computedTypeProperty)
// Prints "27"
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
}
}
}
}
var leftChannel = AudioChannel()
var rightChannel = AudioChannel()
leftChannel.currentLevel = 7
print(leftChannel.currentLevel)
// Prints "7"
print(AudioChannel.maxInputLevelForAllChannels)
// Prints "7"
rightChannel.currentLevel = 11
print(rightChannel.currentLevel)
// Prints "10"
print(AudioChannel.maxInputLevelForAllChannels)
// Prints "10"