第八节属性、枚举rawValue 的原理

2021-02-02  本文已影响0人  天明天

一.属性

1.Swift中跟实例相关的属性可以分为两大类

(1) 存储属性:
 struct Persron {
   var age : Int// 8个字节
   var num: Int // 8个字节
}

var p = Persron(x:10,y:20)

print(MemoryLayout.stride(ofValue:p));// 16个字节
// 枚举不能有存储属性
emun Season {
   case spring(Int)//关联值 存储在枚举类型里面
   case  summer(Double)
}

var s  = Season.summer //只需要一个字节
// 存储关联值跟原始值 都存储在 枚举内存中

(2)计算属性:

Struct  Circle {
      //存储属性
          var radis :  Double 
      // 计算属性
           var next : Double {
           set {
                   radis = newValue/2
                 }
             get {
                   radis * 2   //获取next 的值的时候 调用,就一句代码,可以省略return
               }
         }
}
//使用
var c = Circele(radis : 10)
c.radis = 11

c.next = 40  // 效果:调用 set 方法,newValue = 40,最后 radis = 20
 也可以 自定义参数 这样写
 set (newRadis){
    radis = newRadis / 2 //此时 40 会赋值给 newRadis
} 

c.next //调用 get方法,`注意这里 Get 方法 省略了return 字段`

print(c.radis) //20

上面的结构体 实例占用多少内存? 答案是:8个字节。计算属性不占用对象的存储。本质是方法

(3)存储属性的注意点

在创建类或者结构体的实例对象时,必须为所有的存储属性 赋一个合适初始值

例如:

struct Point {
   
   var nameX: Int
   var nameY: Int
   
   init(){
       self.nameX = 10
       self.nameY = 20
   }
}

//调用
var p1 = Point()

//或者是这个样子写:
struct Point1 {
   var x : Int = 10
   var y : Int = 20
   
}
(4) 计算属性的注意点

计算属性 只能用 var修饰,不能用let, 因为计算属性的值是可能发生变化的(即使是只读计算属性,也可以通过其他属性的值计算出来)

2. 枚举 rawValue的原理


enum Seesson : Int {
    
    case spring = 1, summer, autumn, winter
  
//只实现计算属性
    var rawValue : Int{
        // 只有get方法 可以省略
        switch self {
        case .spring:
            
            return 1
            
         case .summer:
            
            return 2
            
        case .autumn:
        
            return 3
            
        case .winter:
            
            return 4
      }
    
   }
}

var s = Seesson.spring.rawValue

print(s)

3. 延迟存储属性

截屏2020-07-31 下午12.03.35.png

4. 属性观察器

5. 全局变量、局部变量

6. inOut的再次说明 输入输出参数

func setAge( _ num : inOut Int) -> Int{
    age = 20
   return age
}

let age = 10

setAge(&age)//这里调用 要使用修饰符 &,

6.类型属性

属性分类:(1)实例属性:只能通过实例去访问,实例属性又分为:
(2)类型属性: 只能通过类型去访问
struct Sheap {
   var x : Int = 0
   var y : int = 0 //都是实例属性
static var count = 0;//存储类型属性,前面加上 static,只有一份内存。类似全局变量

}

Sheap.count = 10 //调用类型属性

struct Sheap {
   var x : Int = 0
   var y : int = 0 //都是实例属性
  static var count : Int{ // 计算类型属性,也是前面 加上 static

     get {
          return 10 
     }
   }
}
(3)类型属性的细节

(4)类型属性的经典应用:单例模式

public class FileManager {
    
    // 公共类属性,常量 延时初始化,并且线程安全
    public static  let shared : FileManager = FileManager()
    //私有标识,外部无法访问
    private init(){
    }

func openFile(){

}
}

//单利:类型存储属性
public class FileManager {
    public static let shared = {
        // ....
        // ....
        return FileManager()
    }()  //闭包表达式 赋值给存储类型属性
    private init() { }
}

//使用
FileManager.shared.open()

上一篇 下一篇

猜你喜欢

热点阅读