Swift 系統學習 25 類相關 延遲存儲屬性

//: Playground - noun: a place where people can play

import UIKit

/*
 * 本節主要內容:
 * 1.延遲存儲屬性
 */

// 聲明描述閉區間的類
class ClosedRange {
    // 起點和終點存儲屬性
    let start: Int
    let end: Int
    
    // 描述閉區間的寬度計算型屬性
    var width: Int {
        return end - start + 1
    }
    
//    // 第一步: 描述閉區間的和
//    var sum = 0
    
    // 第二步: 聲明計算型屬性sum
//    var sum: Int {
//        var result = 0
//        for index in start...end {
//            result += index
//        }
//        return result
//    }
    
    // 第三步: 延遲存儲屬性
    // 1.在大括號內獲取類的屬性, 必須加self.
    // 2.在大括號後面必須加上小括號
    lazy var sum: Int = {
        print("Start to caculate sum value.")
        var result = 0
        for index in self.start...self.end {
            result += index
        }
        return result
    }() // Swift閉包(JS匿名函數; OC的Block)
    
    init(start: Int, end: Int) {
        self.start = start
        self.end = end
        
//        // 第一步:計算閉區間的和(耗時)
//        for index in start...end {
//            sum += index
//        }
    }
}


var closedRange = ClosedRange(start: 0, end: 1000321)
// 第二步優勢: sum的值不是在init構造階段計算
// 第二步缺點: 每次點語法獲取sum, 每次重新計算, 浪費資源
// 第三步優勢: 沒有在init構造階段計算, 並且只執行一次
closedRange.sum
closedRange.sum
closedRange.sum


// 樣例:
class Location {
    let latitude: Double  = 0.0
    let longitude: Double = 0.0
    
    // 反地理編碼: 通過經緯度獲取用戶的位置信息
    // 1.耗時 + 不需要在init階段 + 計算一次
    lazy var address: String? = {
        // 反地理編碼
        // CLGeocode
        return nil
    }()
}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章