Swift(六)枚舉和結(jié)構(gòu)體

更新:2018.05.24

整理了一下demo:SwiftDemo


好久沒弄了,最近一直在找房子,搬家,軟裝,累瘋了。

枚舉

  • 枚舉在OC中已經(jīng)很常見了,所謂枚舉,是中將變量的值一一列舉出來,并只限于在列舉出來的值的范圍內(nèi)進行取值。
  • 在Swift中,枚舉更加常見,并且不需給枚舉中的每個成員都提供值。
  • Swift中,枚舉可以支持字典、字符、整數(shù)和浮點類型。作為枚舉成員的數(shù)據(jù)類型。
定義

枚舉的定義需要好enum關(guān)鍵字,枚舉的成員則被放置在一對大括號中。

enum 枚舉名稱 {
  // 此處放置枚舉的成員
}

當我們要定義一個用戶等級系統(tǒng)時~~

enum UserLevel {
  case 總經(jīng)理
  case 區(qū)域經(jīng)理
  case 主管
  case 業(yè)務(wù)員
}

UserLevel枚舉中定義的值:總經(jīng)理、區(qū)域經(jīng)理、主管、業(yè)務(wù)員。就會枚舉的成員值或成員,通過case關(guān)鍵字明確要定義的成員。
在定義枚舉時,如果枚舉成員較少,也可以將枚舉成員放置在一行之后中。

例如:

enum UserLevel {
  case 總經(jīng)理,區(qū)域經(jīng)理,主管,業(yè)務(wù)員
}

這兩種方式都可以完枚舉定義

和OC不同的是:

  • Swift的枚舉成員在被創(chuàng)建時,不會被賦予一個默認的整數(shù)值,例如在上面的例子中,總經(jīng)理、區(qū)域經(jīng)理、主管、業(yè)務(wù)員,他們的值并不會等于 0、1、2、3。
  • 當你定義一個枚舉類型的變量或者常量時,在輸入枚舉名稱和.之后,系統(tǒng)會自動彈出枚舉列表。
遍歷枚舉

通常使用switch語句進行枚舉的遍歷操作:

        switch userLevel {
        case UserLevel.業(yè)務(wù)員:
            print("業(yè)務(wù)員登錄形同")
        case UserLevel.主管:
            print("主管登錄系統(tǒng)")
        case UserLevel.區(qū)域經(jīng)理:
            print("區(qū)域經(jīng)理登錄系統(tǒng)")
        default:
            print("大bose登錄系統(tǒng)")
        }
枚舉的原始值

枚舉成員可以使用相同類型的默認值,這些默認值就是枚舉的原始值

enum Gender : UInt8 {
  case Male = 1
  case Female = 2
  case Unknow = 3
}

可以看出,我們定義了一個Gender的枚舉,其原始值類型為UInt8,美劇的三個成員的值是1,2,3。

也可以這樣寫:

enum Gender : UInt8 {
  case Male = 1, Female,Unknow
}

在上面的例子中,Gender.Make = 1,它有明確的原始值,則Gender.Female的隱式原始值是2,以此類推。

給枚舉添加方法

swift中的枚舉可以添加方法

    enum Gender : UInt8 {
        case Male,Female,UnKnow
        func description() {
            switch self {
            case.Male:
                print("Hi,Man~")
            case.Female:
                print("Hi,lady~")
            case.UnKnow:
                print("Hi~")
            }
        }
    }


        let gender = Gender.Female
        gender.description()

在上面的例子中,為Gender 枚舉添加了一個 description的方法,在這個方法中,通過switch遍歷枚舉并輸出。

結(jié)構(gòu)體

  • 在Swfit開發(fā)環(huán)境中,結(jié)構(gòu)體是構(gòu)建代碼所用的一種通用且靈活的結(jié)構(gòu)體。
  • Swfit中,把一些基本數(shù)據(jù)類型,string,array,dictionary等全部變成了結(jié)構(gòu)體,更方便我們使用。
  • 可以為結(jié)構(gòu)體定義變量或常量的屬性,甚至可以像枚舉一樣,給結(jié)構(gòu)體添加方法。
定義

結(jié)構(gòu)體的定義格式和枚舉相似,是以struct關(guān)鍵字來進行定義的。

struct 結(jié)構(gòu)體名稱 {
  // 此處為結(jié)構(gòu)體內(nèi)容
}

舉例將動物園作為一個結(jié)構(gòu)體:

struct Animal {
  let zooName:String = "Beijing Zoo"
  var name:String
}

上面例子中,使用struct關(guān)鍵字定義了一個結(jié)構(gòu)體,由于動物園的名字是固定的,所以給zooName定義一個常量的值,每個動物園的動物有很多種,所以給名字一個變量的值。
對于結(jié)構(gòu)體的實例化,可以這樣:

let animal = Animal(name:"Tiger")

輸出animal中的name屬性:

print(animal.name)      // 輸出結(jié)果為:Tiger

還可以修改實例的name屬性:

var animal = Animal(name:"Tiger")
animal.name = "Elephant"
print(animal.name)      // 輸出結(jié)果為:Elephant

需要注意的是:類是引用類型,而結(jié)構(gòu)體和枚舉都是值類型。值類型是一種當它被指定為常量或變量,或被傳遞給函數(shù)時會拷貝的類型。這意味著你所創(chuàng)建的任意結(jié)構(gòu)體和枚舉實力,作為屬性所包含的任何類型,在代碼傳遞中總是被拷貝的。
如例:

let firstAnimal = Animal(name:"Tiger")
var secondAnimal = firstAnimal
secondAnimal.name = "Elephant"
print(firstAnimal)      // 輸出結(jié)果:Tiger
print(secondAnimal)    // 輸出結(jié)果: Elephant

上例中,創(chuàng)建了一個Animal結(jié)構(gòu)體的實體,并初始化name屬性為Tiger。
然后將firstAnimal實例賦予secondAnimal變量。當firstAnimal被賦予給secondAnimal變量時,firstAnima的值就被拷貝了一份。并將拷貝的實例賦予給secondAnimal,這樣就產(chǎn)生了兩個不同的實例。所以當secondAnimalname屬性修改時,firstAnimalname不會變化。

給結(jié)構(gòu)體添加方法

和枚舉的方法類似

    struct Animal {
        let zooName:String = "Beijing Zoo"
        var name:String
        func say() {
            print("Hi,\(name)!")
        }
    }

        let animal = Animal(name:"Tiger")
        print(animal.say())    // Hi,Tiger!

結(jié)構(gòu)體的下標
  • 結(jié)構(gòu)體、類和枚舉都可以定義下標,它可以作為訪問集合、列表或序列成員元素的快捷方式。
  • 可以使用下標通過索引值來設(shè)置或檢索值,而不需要設(shè)置和檢索分別使用實例方法。
  • 結(jié)構(gòu)體可以定義多個下標,并且下標會基于傳入的索引值的類型,選擇合適的下標重載使用。
  • 下標的語法類似乎實例方法和計算屬性。使用關(guān)鍵字 subscript來定義下標,并指定一個或多個輸入形式參數(shù)和返回參數(shù),與實例方法一樣。

例:

    struct MySubscript {
        var num:Int
        subscript(n:Int) ->Int {
            return num*n
        }
    }

上例中,定義了一個名為MySubscript的結(jié)構(gòu)體,它擁有一個名為num的整形屬性。
在下面的代碼中,使用subscript定義一個下標,通過傳入一個整形參數(shù),將結(jié)構(gòu)體的屬性乘以若干倍。

使用方法如下:

let sub = MySubscript(num:3)
print(sub[3])      // 輸出結(jié)果:9
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容