每天学一点Swift----面向对象上(四)

来源:互联网 发布:c 程序员简历 编辑:程序博客网 时间:2024/05/22 05:02

.存储属性 

  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)


上一篇:每天学一点Swift----面向对象上(三)

下一篇:每天学一点Swift----面向对象上(五)

原创粉丝点击