-
枚舉語法
格式:
enum SomeEnumeration{//枚舉定義放在這里}與C/OC不同,這里的枚舉成員被創(chuàng)建時(shí)不會(huì)被賦予一個(gè)默認(rèn)的整型值,即枚舉成員不會(huì)被隱式的賦值為0,1,2…,相反這些枚舉成員本身就是完備的值。
-
使用switch語句匹配枚舉值
- 在判斷一個(gè)枚舉類型的值時(shí),switch語句必須窮舉所有情況。
- 當(dāng)不需要匹配每個(gè)枚舉成員的時(shí)候,可以提供一個(gè)default分支來涵蓋所有未明確處理的枚舉成員。
-
關(guān)聯(lián)值
enum Barcode{
case UPCA(Int, Int, Int, Int)
case QRCode(String)
}
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
switchproductBarcode {
case .UPCA(let numberSystem, let manufacturer, let product, let check):
print("UPC-A:(numberSystem), (manufacturer), (product), (check).")
case .QRCode(let productCode):
print("QR code: (productCode)")
}
//打?。?br> QR code: ABCDEFGHIJKLMNOPswitchproductBarcode { case let .UPCA(numberSystem, manufacturer, product, check): print("UPC-A:\(numberSystem), \(manufacturer), \(product), \(check).") case let .QRCode(productCode): print("QR code: \(productCode)") } //打?。?QR code: ABCDEFGHIJKLMNOP -
原始值
- 原始值可以是字符串,字符,或者任意整型值或浮點(diǎn)型值。每個(gè)原始值在枚舉聲明中必須是唯一的。
- 原始值和關(guān)聯(lián)值是不同的。原始值是在定義枚舉時(shí)被預(yù)先填充的值。對(duì)于一個(gè)特定的枚舉成員,它的原始值始終不變。關(guān)聯(lián)值是創(chuàng)建于一個(gè)基于枚舉成員的常量或變量時(shí)才設(shè)置的值,枚舉成員的關(guān)聯(lián)值可以變化。
- 使用枚舉成員的rowValue屬性可以訪問該枚舉成員的原始值。
- 原始值構(gòu)造器總是返回一個(gè)可選的枚舉成員。注:原始值構(gòu)造器是一個(gè)可失敗構(gòu)造器,因?yàn)椴⒉皇敲恳粋€(gè)原始值都有與之對(duì)應(yīng)的枚舉成員。
-
遞歸枚舉
-
它有一個(gè)或多個(gè)枚舉成員使用該枚舉類型的實(shí)例作為關(guān)聯(lián)值。使用遞歸枚舉時(shí),編譯器會(huì)插入一個(gè)間接層。你可以在枚舉成員前加上indirect來表示該成員可遞歸。
//(5 + 4) * 2 enum ArithmeticExpression{ case Number(Int) indirect case Addition(ArithmeticExpression, ArithmeticExpression) indirect case Multiplication(ArithmeticExpression, ArithmeticExpression) } let five = ArithmeticExpression.Number(5) let four = ArithmeticExpression.Number(4) let sum = ArithmeticExpression.Addition(five, four) let product = ArithmeticExpression.Multiplication(sum, ArithmeticExpression.Number(2)) //該函數(shù)如果遇到純數(shù)字,就直接返回該數(shù)字的值。 //如果遇到的是加法或乘法運(yùn)算,則分別計(jì)算左邊表達(dá)式和右邊表達(dá)式的值,然后相加或相乘。 func evaluate(_ expression: ArithmeticExpression) -> Int{ switch expression { case .Number(let value): return value case .Addition(let left, let right): return evaluate(left) + evaluate(right) case .Multiplication(let left, let right): return evaluate(left) * evaluate(right) } } print(evaluate(product))
-
-
類和結(jié)構(gòu)體對(duì)比
-
共同處:
- 定義屬性用于存儲(chǔ)值;
- 定義方法用于提供功能;
- 定義下標(biāo)操作似的可以通過下標(biāo)語法來訪問實(shí)例所包含的值;
- 定義構(gòu)造器用于生成初始化值;
- 通過擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能;
- 實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能。
-
類的附加功能:
- 繼承允許一個(gè)類繼承另一個(gè)類的特征;
- 類型轉(zhuǎn)換允許在運(yùn)行時(shí)檢查和解釋一個(gè)類實(shí)例的類型;
- 析構(gòu)器允許一個(gè)類實(shí)例釋放任何其所被分配的資源;
- 引用計(jì)數(shù)允許對(duì)一個(gè)類的多次引用。
結(jié)構(gòu)體總是通過復(fù)制的方式在代碼中傳遞,不使用引用計(jì)數(shù)。
類定義:
class SomeClass{ // class definition goes here}結(jié)構(gòu)體定義:
struct SomeStructure{ // structure definition goes here}結(jié)構(gòu)體和類都是用構(gòu)造器來生成新的實(shí)例。構(gòu)造器語法的最簡(jiǎn)單形式是在結(jié)構(gòu)體或者類的類型名稱后跟隨一對(duì)空括號(hào)。
通過使用點(diǎn)語法來訪問實(shí)例的屬性。
與OC不同,Swift允許直接設(shè)置結(jié)構(gòu)體屬性的子屬性。
所有結(jié)構(gòu)體都有一個(gè)自動(dòng)生成的成員逐一構(gòu)造器,用于初始化新結(jié)構(gòu)體實(shí)例中成員的屬性。 但是類實(shí)例沒有默認(rèn)的成員逐一構(gòu)造器。
-
-
結(jié)構(gòu)體和枚舉是值類型
- 在Swift中,所有的結(jié)構(gòu)體和枚舉類型都是值類型。這意味著它們的實(shí)例,以及實(shí)例中所包含的任何值類型屬性,在代碼中傳遞的時(shí)候都會(huì)被復(fù)制。
-
類是引用類型
- 引用類型再被賦予到一個(gè)變量、常量或者傳遞到一個(gè)函數(shù)時(shí),其值不會(huì)被拷貝。因此,引用的是已存在的實(shí)例本身而不是其拷貝。
- “===“等價(jià)于表示兩個(gè)類類型(class type)的常量或者變量引用同一個(gè)類實(shí)例?!?=”等于表示兩個(gè)實(shí)例的值相等或相同。
-
類和結(jié)構(gòu)體的選擇
-
結(jié)構(gòu)體適用情境:
- 該數(shù)據(jù)結(jié)構(gòu)的主要目的是用來封裝少量相關(guān)簡(jiǎn)單數(shù)據(jù)值。
- 有理由預(yù)計(jì)該數(shù)據(jù)結(jié)構(gòu)的實(shí)例在被賦值或傳遞時(shí),封裝的數(shù)據(jù)將會(huì)被拷貝而不是被引用。
- 該數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)的值類型屬性,也應(yīng)該被拷貝,而不是被引用。
- 該數(shù)據(jù)結(jié)構(gòu)不需要去繼承另一個(gè)既有類型的屬性或者行為。
在所有其它案例中,定義一個(gè)類,生成一個(gè)它的實(shí)例,并通過引用來管理和傳遞。實(shí)際中,這意味著絕大部分的自定義數(shù)據(jù)構(gòu)造都應(yīng)該是類,而非結(jié)構(gòu)體。
-
筆記摘要(八)--Swift3.0之枚舉、類和結(jié)構(gòu)體
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- importUIKit classViewController:UITabBarController{ enumD...
- Swift語法基礎(chǔ)(五)-- (類和結(jié)構(gòu)體、屬性、方法) 本章將會(huì)介紹 類和結(jié)構(gòu)體對(duì)比結(jié)構(gòu)體和枚舉是值類型類是引用...
- 常量與變量使用let來聲明常量,使用var來聲明變量。聲明的同時(shí)賦值的話,編譯器會(huì)自動(dòng)推斷類型。值永遠(yuǎn)不會(huì)被隱式轉(zhuǎn)...
- Swift語言中,具有類特征的類型包括三種,即枚舉類型、結(jié)構(gòu)類型(包括基本類型,基本類型實(shí)際都是結(jié)構(gòu)類型的特例)、...
- (隨到隨學(xué),報(bào)名即安排最近上課時(shí)間) 課程介紹: 喜歡皮革制品的朋友們一定對(duì)手工皮革包包的純手工質(zhì)感,以及那經(jīng)過歲...