Swift

Swift----类型属性

2019-08-23  本文已影响0人  Leo_L

类型属性

实例属性属于一个特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例之间的属性相互独立。
你也可以为类型本身定义属性,无论创建了多少个该类型的实例,这些属性都只有唯一一份。这种属性就是类型属性。
类型属性用于定义某个类型所有实例共享的数据,比如所有实例都能用的一个常量(就像 C 语言中的静态常量),或者所有实例都能访问的一个变量(就像 C 语言中的静态变量)。
存储型类型属性可以是变量或常量,计算型类型属性跟实例的计算型属性一样只能定义成变量属性。

注意
跟实例的存储型属性不同,必须给存储型类型属性指定默认值,因为类型本身没有构造器,也就无法在初始化过程中使用构造器给类型属性赋值。
存储型类型属性是延迟初始化的,它们只有在第一次被访问的时候才会被初始化。即使它们被多个线程同时访问,系统也保证只会对其进行一次初始化,并且不需要对其使用 lazy 修饰符。

类型属性语法

CObjective-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()

实例someStructuresomeStructure1的中的类型属性storedTypeProperty,computedTypeProperty是独立的,是只属于它们自己的,因为它们是独立的所以是不能使用实例去调用结构体的类型属性,否则会报错

101946F5-9F57-4068-8B63-E9FB3921BCC7.png

属性学习可参照属性-SwiftGG

上一篇下一篇

猜你喜欢

热点阅读