类型属性
实例属性属于一个特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例之间的属性相互独立。
你也可以为类型本身定义属性,无论创建了多少个该类型的实例,这些属性都只有唯一一份。这种属性就是类型属性。
类型属性用于定义某个类型所有实例共享的数据,比如所有实例都能用的一个常量(就像 C 语言中的静态常量),或者所有实例都能访问的一个变量(就像 C 语言中的静态变量)。
存储型类型属性可以是变量或常量,计算型类型属性跟实例的计算型属性一样只能定义成变量属性。
注意
跟实例的存储型属性不同,必须给存储型类型属性指定默认值,因为类型本身没有构造器,也就无法在初始化过程中使用构造器给类型属性赋值。
存储型类型属性是延迟初始化的,它们只有在第一次被访问的时候才会被初始化。即使它们被多个线程同时访问,系统也保证只会对其进行一次初始化,并且不需要对其使用lazy
修饰符。
类型属性语法
在C
或 Objective-C
中,与某个类型关联的静态常量和静态变量,是作为global
(全局)静态变量定义的。但是在 Swift
中,类型属性是作为类型定义的一部分写在类型最外层的花括号内,因此它的作用范围也就在类型支持的范围内。
使用关键字 static 来定义类型属性。在为类定义计算型类型属性时,可以改用关键字 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 6
}
}
class SomeClass {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 27
}
class var overrideableComputedTypeProperty: Int {
return 107
}
}
获取和设置类型属性的值
print(SomeStructure.storedTypeProperty)
// 打印“Some value.”
SomeStructure.storedTypeProperty = "Another value."
print(SomeStructure.storedTypeProperty)
// 打印“Another value.”
print(SomeEnumeration.computedTypeProperty)
// 打印“6”
print(SomeClass.computedTypeProperty)
// 打印“27”
类型属性与非类型属性的区别
给上例中结构体SomeStructure
增加一个常量存储属性
struct SomeStructure {
let commonProperty: NSString = "commonProperty"
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 1
}
}
类型属性调用
print(SomeStructure.storedTypeProperty)
非类型属性调用
let someStructure = SomeStructure.init()
print(someStructure.commonProperty)
实例属性属于一个特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例之间的属性相互独立。
创建两个上述例子的实例:
let someStructure = SomeStructure.init()
let someStructure1 = SomeStructure.init()
实例someStructure
和someStructure1
的中的类型属性storedTypeProperty
,computedTypeProperty
是独立的,是只属于它们自己的,因为它们是独立的所以是不能
使用实例
去调用类
或 结构体
的类型属性,否则会报错
属性学习可参照属性-SwiftGG
网友评论