[swift 進階]讀書筆記-第五章:結構體和類 C5P1_2值型別_可變性

liaoWorking在掘金發表於2018-12-27

結構體和類

值型別:結構體列舉 引用型別:

使用類,我們可以通過繼承來共享程式碼。 結構體、列舉無法繼承。正好符合swift的面相協議程式設計的特性。

5.1值型別(value type)


定義:

將記憶體儲存在棧內(這句我百度的),持有者唯一的型別。 通俗的來說就是:值變數被複制時,本身會被複制,而不是引用被複制。 ps. 這裡講的比較抽象。前面在講迭代器的時候已經有講過了。忘卻的同學可以回頭看看~

使用場景:我們不用關心其生命週期的優先使用值引用

結構體複製時,只能改變它自己的複製,這個就叫做值語義 (value semantics)

對於類中的物件來說,它是通過傳遞引用來工作了,所以可以有多個持有者。

值引用的優點:不可能存在迴圈引用!!!(因為它只有一個持有者) 這個就很酷了,可以在專案中少很多考慮。

5.2可變性

很多bug的起因都是可變性引起的。 Swift 可以讓我們在寫出安全程式碼的同時,保留直觀的可變程式碼的⻛格

    ///邊遍歷邊運算元組是危險的 這裡會崩潰
    var mArray:NSMutableArray = [1,2,3,4,5,6,7,8]
    for _ in mArray {
        mArray.removeAllObjects()
    }
    
    ///下面是安全的 removeAllObjects方法呼叫了8次
    ///因為不論如何移除,陣列的迭代器的複製依然持有最 開始的三個元素。

    var array:[Int] = [1,2,3,4,5,6,7,8]
    for _ in array {
        mArray.removeAllObjects()
    }
    print(mArray.count) //0
複製程式碼

文章原始檔地址

相關文章