第2部分 故事的進階要素 - 程式設計語言Swift的進階部分
8 枚舉, 結構體和類
8.1 概念通俗講解
1). 枚舉,簡單了解:一一列舉的意思。也就是說把互斥的類型一個一個列舉出來。
例如性别,列舉出來其中的類型:男和女。
2). 類是對現實中一類具有共同特征事物的抽象。例如我們可以把人當做一個類。
與類相對應的就是執行個體。執行個體就是類具體的實際例子。例如人是類,人中的一個具體人,比如小王,就是執行個體。
類的本質是一種資料類型,一種比Int等基本資料更複雜的資料類型。
3). Swift中,從概念的角度講,結構體和類很像。
結構體也是對現實中一類具有共同特征事物的抽象。舉例:我們也可以把人當做一個結構體。
與結構體相對應的也是執行個體。例如人是結構體,人中的一個具體人,比如小王,就是執行個體。
從概念上看,結構體和類是很相似的,不過實際使用中,還是有很多不同的。下面是結構體與類的比較
結構體和類的共同點
(1)有屬性
(2)有方法
(3)可定義下标
(4)可定義構造器
(5)可通過擴充增加功能
(6)可遵循協定提供功能
結構體和類的不同點
類具有一些結構體沒有的功能:
(1)繼承特性
(2)類型轉換在運作時可以檢查和解釋一個類執行個體
(3)析構器讓一個類的執行個體可以釋放被配置設定的資源
(4)引用計數功能
注:屬性,方法,下标,構造過程,擴充,協定,繼承,類型轉換,析構過程和自動引用計數後面會具體講解。
8.2 最簡潔的定義格式
1). 枚舉定義
使用enum關鍵字定義枚舉
enum 枚舉名{
case 枚舉值
case 枚舉值
}
舉例:
enum Sex{
case 男
case 女
}
定義小王的性别是男性
var xiaoWangSex = Sex.男
定義變量時如果指定了枚舉的類型,Sex.男可以簡化為.男
var xiaoLiSex : Sex = .男
如下的各個case可以用一個case來簡寫
enum Age{
case one
case two
case three
case four
}
簡寫形式如下
enum Age2{
case one, two, three, four
}
var xiaoWangAge = Age.two
2). 結構體定義
使用struct關鍵字定義結構體
struct 結構體名{
}
舉例:
struct person2{
}
定義執行個體xiaoWang
定義執行個體xiaoLi
3)類定義
使用class關鍵字定義結構體
class類名{
}
舉例:
class person{
}
8.3 我的經驗總結
1)枚舉的本質是一個資料類型。一個自定義的資料類型。主要是定義各種互斥值的資料類型。
2)枚舉的case後面是變量和常量,不能用已經知道的資料類型,例如
enum Age{
case 1
case 2
}
1和2屬于Int類型的值,這樣是不允許的。我們需要定義變量one和two才可以
3). 枚舉和switch經常配對使用
舉例
enum Sex{
case 男
case 女
}
var xiaoSongSex = Sex.男
switch xiaoSongSex {
case .男:
print("小宋是男性")
case .女:
print("小宋是女性")
}
4). 結構體是值類型,類是引用類型的總結
舉例:
class person{
var age = 10
}
struct person2{
var age = 20
}
var xiaoWang = person()
var xiaoLi = person2()
var xiaoWang2 = xiaoWang
xiaoWang.age = 15
print(xiaoWang2.age)
var xiaoLi2 = xiaoLi
xiaoLi.age = 15
print(xiaoLi2.age)
注:這裡var age = 10和var age = 20的age是屬性,對于屬性後面會做具體的講解。
類是引用類型,引用類型執行個體使用的解釋:
var xiaoWang2 = xiaoWang這一步實際是xiaoWang把值引用給了xiaoWang2,xiaoWang和xiaoWang2同時指向了1個記憶體位址。是以xiaoWang.age的值改變,xiaoWang2.age的值也跟着改變,此時xiaoWang2.age值是15
結構體是值類型,值類型執行個體使用的解釋:
var xiaoLi2 = xiaoLi這一步實際是xiaoLi把值拷貝一份給xiaoLi2,xiaoLi和xiaoLi2是有2個記憶體位址的。是以xiaoLi.age的值改變,xiaoLi2.age的值不改變,此時xiaoLi2.age的值是20
5). 類執行個體的比較
類是引用類型,比較兩個類執行個體是否等價與非等價的運算符如下
等價于 (=)
非等價 (!)
舉例
class person{
var age = 10
}
class person2{
var age = 10
}
var xiaoWang = person()
var xiaoWang2 = person2()
if xiaoWang === xiaoWang2{
}
注:本人水準和能力有限,如果哪些地方寫錯了,請大家給我回報,我會及時修改。