Swift學習筆記4

1.延遲存儲屬性是指當第一次被調用的時候纔會計算其初始值的屬性。在屬性聲明前使用lazy來標示一個延遲存儲屬性。html

必須將延遲存儲屬性聲明成變量(使用var關鍵字),由於屬性的初始值可能在實例構造完成以後纔會獲得。而常量屬性在構造過程完成以前必需要有初始值,所以沒法聲明成延遲屬性。swift

若是一個被標記爲lazy的屬性在沒有初始化時就同時被多個線程訪問,則沒法保證該屬性只會被初始化一次。spa

 

2.計算屬性不直接存儲值,而是提供一個 getter 和一個可選的 setter,來間接獲取和設置其餘屬性或變量的值。若是計算屬性的 setter 沒有定義表示新值的參數名,則可使用默認名稱newValue線程

var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }

必須使用var關鍵字定義計算屬性,包括只讀計算屬性,由於它們的值不是固定的。let關鍵字只用來聲明常量屬性,表示初始化後再也沒法修改的值。 code

只讀計算屬性的聲明能夠去掉get關鍵字和花括號:htm

var volume: Double {
        return width * height * depth
    }

3.屬性觀察器監控和響應屬性值的變化,每次屬性被設置值的時候都會調用屬性觀察器,甚至新值和當前值相同的時候也不例外。blog

能夠爲除了延遲存儲屬性以外的其餘存儲屬性添加屬性觀察器,也能夠經過重寫屬性的方式爲繼承的屬性(包括存儲屬性和計算屬性)添加屬性觀察器。繼承

不須要爲非重寫的計算屬性添加屬性觀察器,由於能夠經過它的 setter 直接監控和響應值的變化。 get

能夠爲屬性添加以下的一個或所有觀察器:class

  • willSet在新的值被設置以前調用
  • didSet在新的值被設置以後當即調用

父類的屬性在子類的構造器中被賦值時,它在父類中的willSetdidSet觀察器會被調用。

var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }

 

4.全局的常量或變量都是延遲計算的,跟延遲存儲屬性類似,不一樣的地方在於,全局的常量或變量不須要標記lazy修飾符。
局部範圍的常量或變量從不延遲計算。 

 5.存儲型類型屬性能夠是變量或常量,計算型類型屬性跟實例的計算型屬性同樣只能定義成變量屬性。

跟實例的存儲型屬性不一樣,必須給存儲型類型屬性指定默認值,由於類型自己沒有構造器,也就沒法在初始化過程當中使用構造器給類型屬性賦值。
存儲型類型屬性是延遲初始化的,它們只有在第一次被訪問的時候纔會被初始化。即便它們被多個線程同時訪問,系統也保證只會對其進行一次初始化,而且不須要對其使用lazy修飾符。

使用關鍵字static來定義類型屬性。在爲類定義計算型類型屬性時,能夠改用關鍵字class來支持子類對父類的實現進行重寫。

 

 6.實際上,你沒必要在你的代碼裏面常常寫self。不論什麼時候,只要在一個方法中使用一個已知的屬性或者方法名稱,若是你沒有明確地寫self,Swift 假定你是指當前實例的屬性或者方法。在類型方法的方法體(body)中,self指向這個類型自己,而不是類型的某個實例。這意味着你能夠用self來消除類型屬性和類型方法參數之間的歧義

 7.結構體和枚舉是值類型。通常狀況下,值類型的屬性不能在它的實例方法中被修改。

可是,若是你確實須要在某個特定的方法中修改結構體或者枚舉的屬性,你能夠選擇變異(mutating)這個方法,而後方法就能夠從方法內部改變它的屬性;而且它作的任何改變在方法結束時還會保留在原始結構中。

可變方法可以賦給隱含屬性self一個全新的實例。

相關文章
相關標籤/搜索