swift學習筆記之-枚舉

//枚舉定義安全

 

import UIKit函數

 

//枚舉定義 (枚舉、結構體、類的名字首字母必須大寫,表示爲定義了新的類型)code

/*枚舉爲一組相關的值定義了一個共同的類型,使你能夠在你的代碼中以類型安全的方式來使用這些值。枚舉成員能夠指定任意類型的關聯值存儲到枚舉成員中遞歸

 

枚舉類型是一等(first-class)類型。它們採用了不少在傳統上只被類(class)所支持的特性,例如計算型屬性(computed properties),用於提供枚舉值的附加信息,實例方法(instance methods),用於提供和枚舉值相關聯的功能。枚舉也能夠定義構造函數(initializers)來提供一個初始值;能夠在原始實現的基礎上擴展它們的功能;還能夠遵照協議(protocols)來提供標準的功能編譯器

 

遞歸(indirect)枚舉:遞歸枚舉(recursive enumeration)是一種枚舉類型(嵌套),它有一個或多個枚舉成員使用該枚舉類型的實例做爲關聯值。使用遞歸枚舉時,編譯器會插入一個間接層。你能夠在枚舉成員前加上indirect來表示該成員可遞歸it

*/io

enum Barcode {編譯

    case UPCA(Int, Int, Int, Int)class

    case QRCode(String)import

}

//定義一個名爲Barcode的枚舉類型,它的一個成員值是具備(Int,Int,Int,Int)類型關聯值的UPCA,另外一個成員值是具備String類型關聯值的QRCode。」

//這個定義不提供任何Int或String類型的關聯值,它只是定義了,當Barcode常量和變量等於Barcode.UPCA或Barcode.QRCode時,能夠存儲的關聯值的類型。

 

enum Planet{

    case qiuti(String,String,String)

    case canshu([Int],String)

}

let wt1 = Planet.qiuti("diqiu", "yueqiu", "taiyang")

let wt2 = Planet.canshu([1,2,3,4], "數據")

switch wt2{

case .qiuti(let a,let b,let c):      //將值綁定給常量或變量

    print("\(a)、\(b)、\(c)")

case let .canshu(array,str):         //聲明關鍵字let、var可前置

    print("\(array)、\(str)")

}

//=====================================================

enum Name:Int{

    case menber1 = 1,menber2,menber3    //原始值的隱式賦值

    case menber4,menber5

}

//枚舉成員原始值:rawValue,若爲Int枚舉其成員默認rawValue爲0,1,2...,若爲String則爲成員名字

var meijushili = Name.menber1

meijushili = .menber5

var c = meijushili.rawValue

print(c)  //c = 5

var m = Name(rawValue: 2) //m = Name.menber2,返回的是可選的枚舉類型,原始值構造器是一個可失敗構造器

print(m)

//======================================================

//枚舉類型應用:計算表達式的值,如: (3+5)*(11-9)

indirect enum Jisuan {        //外置indirect 關鍵字表示該枚舉的全部成員都可遞歸(嵌套),內置則指定某成員可遞歸

    case number(Int)

    case jiafa(Jisuan,Jisuan)

    case jianfa(Jisuan,Jisuan)

    case chengfa(Jisuan,Jisuan)

    case chufa(Jisuan,Jisuan)

}

func kaishi(suanfa:Jisuan)->Int{

    switch suanfa{

    case .number(let a):

        return a

    case .jiafa(let left, let right):

        return kaishi(left) + kaishi(right)

    case .jianfa(let left, let right):

        return kaishi(left) - kaishi(right)

    case .chengfa(let left, let right):

        return kaishi(left) * kaishi(right)

    case .chufa(let left, let right):

        return kaishi(left) / kaishi(right)

    }

}

//var a = Jisuan.number(15)

var sumjiafa = Jisuan.jiafa(.number(3), .number(5))  //3+5

var sumjianfa = Jisuan.jianfa(.number(11), .number(9))  //11-9

var sumchengfa = Jisuan.chengfa(sumjiafa, sumjianfa)   //(3+5)*(11-9) = 16

var sumchufa = Jisuan.chufa(sumchengfa, sumjiafa)  //(3+5)*(11-9)/(3+5) = 2

var sum1 = kaishi(sumchengfa)

var sum2 = kaishi(sumchufa)

print(sum1)

print(sum2)

相關文章
相關標籤/搜索