美文网首页
每天学一点Swift----面向对象上(四)

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

作者: 冯可乐同学 | 来源:发表于2017-05-26 21:55 被阅读4次

    七.存储属性

    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----面向对象上(四)

          本文链接:https://www.haomeiwen.com/subject/ytxffxtx.html