引用類型
傳遞的是對象的指針,這些指針保存在棧(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)