Swift 八:属性

1).存储属性

类和结构体中的属性,无特殊处理,都是存储属性,即属性开辟了内存空间,可以存储值。

存储属性分为常量存储属性和变量存储属性,常量存储属性只可以在定义的时候赋初值,后续不可以更改

struct Rect {

   let width : Double = 10

   var height : Double

}

var _ = Rect(height: 100)

结构体常量对象,他本身是一个常量,其次,它对应的对象也是常量,不可以被修改

let rect1 : Rect = Rect(height: 100)   // 常量rect1的height属性可以通过点语法进行后续修改

类常量对象,他本身是一个常量,但他对应的成员属性,可以通过他来进行修改


2).延迟存储属性

swift中所有的存储属性必须有初始值,也就是当构造完一个类或者结构体的对象后,对象中所有的存储属性必须有初始值。

但是也有例外,其中,延迟存储属性可以将属性的初始化向后推迟到该属性第一次被调用的时候。

延迟存储属性适用场景:

  1.属性不适合一开始就初始化,取决于外部因素

  2.属性有可能从来不会用到,但是他的初始化有需要较长的时间

class student {

   var name : NSString = ""

   lazy var averageScore : Double = 0

}


3).计算属性

1.swift中的计算属性不直接存储值,跟存储属性不同,没有任何的“后端存储与之对应”(不占用存储空间)。

2.计算属性用于计算,可以实现setter和getter这两种方法。

3.枚举enum不可以有存储属性,但可以有计算属性。

对象.属性 = value  --- setter方法

let value = 对象.属性 --- getter方法

struct MyRect {

   var origin : (x : Double , y : Double) = (0 , 0)  // 存储属性

   var size : (w : Double , h : Double) = (0 , 0)    // 存储属性

   var center : (x : Double , y : Double) {            //计算属性

     get {

          return (origin.x + size.w / 2, origin.y + size.h / 2)

      }

     set (n) {

       //origin是存储属性 可以被赋值

      //center是计算属性 不可以被赋值

       //newValue是系统提供的默认setter值 : set �{ origin.x = newValue.x - size.w / 2 }

      origin.x = n.x - size.w / 2

       origin.y = n.y - size.h / 2

     }

   }

}


4).只读计算属性

只提供get方法,不提供set方法的属性,称为只读计算属性

struct MyRect {

    var size : (w : Double , h : Double) = (0 , 0) // 存储属性

    var center : (x : Double , y : Double) { //计算属性

   //    get {

            return (size.w / 2,  size.h / 2)

   //     }

 }

}      // 只读计算属性  get方法的关键字get和括号可以省略掉


5).属性观察器

观察属性的变化,在属性被修改时,调用我们事先写好的代码去执行额外的动作,类似于OC中的KVO

属性观察器有两种:

  1. willSet 在设置新值时,赋值前调用

  2. didSet 在新值被赋之后调用

可以直接为除lazy属性之外的存储属性添加属性观察器,也可以在继承类中为父类的计算属性提供属性观察期

struct MyRect {

    var center : (x : Double , y : Double) {

          willSet {

                print("\(newValue.x)")

           }

          didSet {

               print("\(oldValue.x)")

          }

     }

}


6).类型属性

1.也就是“类”本身定义属性,这样的属性不隶属于某一个“对象”,可以认为所有的对象公用这个属性;

2.结构体或者枚举可以定义存储或者计算型类属性,而类只能定义计算型类属性,不可以定义存储类型

struct MyRect {

     static var center : (x : Double , y : Double) = (10 ,10)   //如果在类中  static需要换为class关键字

}

MyRect.center = (10,11)

你可能感兴趣的:(Swift 八:属性)