數據結構:類、結構體、枚舉

引用類型

傳遞的是對象的指針,這些指針保存在棧(Stack)上,棧中的對象系統會自動爲我們管理(ARC),這樣我們就不用自己去開闢和釋放

內存空間了,一旦沒有指針指向對象,那麼對象就會馬上被清理掉,這種機制叫做自動引用計數(ARC)。

這些對象存儲在(Heap)堆中

 

類(Class)是引用類型

定義類使用class 關鍵字

class newClass {

// 創建了一個新類

}

唯一具有繼承屬性

可以定義構造方法

 

值類型

可以定義構造方法

傳遞存儲的是複製後的值

這些對象直接存儲在棧(Stack)上

變長的結構體和枚舉需要堆內存的配合,棧的空間有限,運行速度更快。

寫時拷貝(copy-on-Write)

當使用方法修改內部屬性時,必須在方法前加上關鍵字 “mutating”

mutating (變異方法)

1.只能用於值類型,如結構體和枚舉

2.因爲要改變自己,所以要定義爲變量類型(var),而不能是常量類型(let)

 

在屬性類型明確的情況下,一個值類型的長度是固定的,常數長度的複製時間成本是O(1)

 

結構體(Structure)是值類型

使用struct關鍵字聲明一個結構體

struct newStruct {

// 創建了一個結構體

}

Swift中基礎數據類型都是結構體,無論是整數,浮點數,還是數組和字典。範圍(Range)也是一個結構體

範圍的定義也是泛型的,一個數組的範圍就是Range<Int>,一個字符串的範圍就是Range<String.Index>

 

枚舉(Enumeration)是值類型

使用enum關鍵字定義枚舉。枚舉的屬性只能是計算屬性

當某樣東西在一種情況下是一個值,在另一種情況下是另一個值,但是不可能同時擁有這兩個值的時候,使用枚舉是非常合適的。

enum newEnum {

// 創建了一個枚舉

}

 

一個驚人的事實是:我們之前接觸的可選類型也是一個枚舉!它是一個非常簡單的枚舉,同時它還是一個泛型。定義如下:

enum Optional<T> {

    case None

    case Some(T)

}

 

可選類型解包

var showStr = str!

解包操作其實是一個Switch操作,上面的代碼等同於

switch str {

    case Some(let value):showStr = value

    case None: //發生異常

}

enum Turn {

    case left

    case right

    var reminder: String {

        //枚舉內部訪問 case

        switch self {

        case .left:

            return "左轉"

        case .right:

            return "右轉"

        }

    }

}

let turn = Turn.left

print(turn.reminder)

發佈了55 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章