七.存储属性
1.存储属性指的是存储在类、结构体里的变量或常量。
2. Swift中定义存储属性的语法与定义变量或常量的语法基本基本相同。
3.Swift的存储属性又可以分为实例存储属性和类型存储属性。其中,实例存储属性是属于单个的实例;而类型存储属性则属于类型本身。
4.枚举不能定义实例存储属性,只有类和结构体才能定义实例存储属性;枚举、结构体和类都可以定义类型存储属性。
5.Swift要求所有的存储属性必须显式指定初始值,要么在定义时指定初始值,要么在构造器中初始化----只有实例存储属性才能在构造器中初始化。
6.前面已经提到过,结构体会有两个构造器:一个无参的默认构造器,一个初始化所有参数的构造器。现在来具体说明一下:
(1)如果程序为所有的实例存储属性都指定初始值,并且没有为结构体提供任何构造器,系统将会为该结构体提供两个构造器,一个无参的构造器,一个初始化所有实例存储属性的构造器。
(2)如果程序没有为所有的实例存储属性都指定初始值,并没有为结构体提供任何构造器,系统将会为该结构体只提供一个构造器:一个初始化所有实例存储属性的构造器。此时,系统不会为结构体提供无参的构造器。因为无参的构造器无法对实例存储属性进行初始化。
(3)如果程序为结构体提供了构造器,系统将不再会为结构体提供构造器,此时程序必须为结构体的所有存储属性提供初始值,要么在定义时指定,要么在构造器中指定初始值。
7.如果将存储属性的类型声明为可选类型,那么程序可以不为可选类型提供初始值,因为系统默认为nil。
8.如果程序创建了一个结构体实例,并将其赋值给let声明的常量,那么该结构体实例就是”不可变的“----包括该结构体的所有实例属性,,即使在实例属性用var声明的。
9.延迟存储属性:在第一次被调用时才会被计算初始值的属性,声明延迟存储属性用lazy关键字。
10.延迟存储属性必须是变量,不能是常量。
11.延迟存储是一种延迟加载机制,当某个实例持有另一个创建成本较大的实例的引用时,使用延迟存储可以降低内存开销,从而提升程序性能。举个栗子:
class Dept
{
var id : Int
var info : String
init(id : Int)
{
self.id = id;
//sleep 2s
NSThread.sleepForTimeInterval(2)
self.info = "模拟读取数据"
}
}
class User
{
var id : Int = 0
var dept = Dept(id:20)
var nicks = [String]()
}
var user = User()
user.nicks.append("abc")
user.nicks.append("def")
print(user.nicks)
从上面可以看出,如果不使用延迟存储机制,程序必须在创建User实例时完成dept属性的初始化。如果Dept是一个创建成本较大的实例,这将导致创建User实例也变成耗时操作。
上面使用User实例的时候,并没有用到dept属性,也就是说程序在这里并需要dept属性,但是还是要浪费多余的时间和内存取初始化。在这个情况下,可以考虑将dept属性设置为延迟存储机制。代码如下:lazy var dept = Dept(id : 20)
网友评论