Swift 學習筆記

Enum

使用enum避免瑣碎的定義

根據史丹佛白鬍子教授Paul的發音,enum唸作"衣囊"。

先談談沒有enum的時候,如何使用變數(常數)表示共同認知的事物。假設我們要定義一些寵物種類,除了使用字串具體描述對象,最簡單的方式莫過於運用整數配合事先說好的規則(convention)。

  • Dog = 1
  • Cat = 2
  • Rabbit = 3
var hisPet = 2  //表示是隻兔子
var herPet = 3  //但如果出現未定義的數值該怎麼辦?

使用enum不需要繁瑣的定義,程式自然能區別變數的意義。

enum Pet {
    case Dog
    case Cat
    case Rabbit
}

var hisPet = Pet.Dog
var herPet: Pet = .Cat

enumrawValue

配合rawValue定義enum的值,可以讓enum自帶有意義的資訊。

enum Pet: String {
    case Dog = "🐶"
    case Cat = "🐱"
    case Rabbit = "🐰"
}

var myPet = Pet.Rabbit
println("my pet is a \(myPet.rawValue)")    //output: my pet is a 🐰

enum搭配switch

enum最大的用處就是搭配switch

enum Pet {
    case Dog
    case Cat
    case Rabbit
}

var myPet = Pet.Rabbit

switch myPet {
case .Dog: "is a dog"
case .Cat: "is a cat"
case .Rabbit: "is a rabbit"     //return: "is a rabbit"
default: break                  //not necessary
}

只要case涵蓋所有enum的可能性,switch最後不使用default捕捉剩餘可能也無妨。

Associated Value

Associated Value 讓enum功能更強大,除了case宣告的種類之外,還可以把值夾帶在enum變數中。先判斷變數屬於那個case,再透過(let name)取出夾帶在enum的值,用法請見範例。

enum Value {
    case 整數(Int)
    case 浮點(Float)
    case 字串(String)
}

func describe(value: Value) -> String {
    switch value {
    case .整數(let int):
        return "整數: \(int)"
    case .浮點(let float):
        return "浮點: \(float)"
    case .字串(let string):
        return "字串: \(string)"
    }
}

describe(Value.整數(1234))        //return: "整數: 1234"
describe(Value.浮點(3.14))        //return: "浮點: 3.14"
describe(Value.字串("hello"))     //return: "字串: hello"

enum初始化函式

enumclassstruct一樣,都可以有初始化函式,不過應該沒人會這麼使用吧?

enum Value {
    case 整數(Int)
    case 浮點(Float)
    case 字串(String)

    init() {
        self = .字串("hello world")
    }
}

var value = Value()