Swift 枚舉的用法


1、基本用法

//enum direction {
//    case north
//    case south
//    case west
//    case east
//}  等價於下面寫法
enum direction {
    case north,south,west,east
}

var dir = direction.north
dir = .south
dir = direction.west
//print(dir)

switch dir  {
case .south :
    print("south")
case .north :
    print("north")
case .east :
    print("east")
case .west :
    print("west")
}
//輸出 west

2、關聯值 (associated Values )

enum score {
    case point (Int)
    case grade (Character)
}
var sc = score.point(10)
sc = .grade("A")

//print(sc)

switch sc {
case let .point(i):
    print("分數\(i)")
case let .grade(i):
    print("等級\(i)")
}
//輸出 等級A

enum date{
    case ymd (Int,Int,Int)
    case string (String)
}

var d = date.ymd(2005, 8, 8)
//d = .string("2008-8-8")

switch d {
case let .string(i):
    print("sting時間\(i)")
case let .ymd(a, b, c): // .ymd(let a,let b,let c):
      print("時間\(a)-\(b)-\(c)")
}
//時間2005-8-8 輸出

3、原始值  rawValue

enum grade :String{
    case perfect = "A"
    case great = "B"
    case good = "C"
    case bad = "D"
}
print(grade.perfect.rawValue) //A
print(grade.great.rawValue)//B
print(grade.good.rawValue)//C
print(grade.bad.rawValue)//D

隱式原始值

//t如果枚舉初始值類型為int \ String  Swift 會為其自動分配原始值
enum time :Int { //默認值 0 1 2
   case morning , afternoon ,evening
}
print(time.afternoon.rawValue) // 1
enum direction : String { //默認值就是當前字符串
    case north,south,west,east
}

4、遞歸枚舉

indirect enum mathExpor{
    case num(Int)
    case sum(mathExpor,mathExpor)
    case difference(mathExpor,mathExpor)
}
let one = mathExpor.num(8)
let two = mathExpor.num(5)
let three = mathExpor.num(3)
let sum = mathExpor.sum(one, two)
let difference = mathExpor.difference(sum, three)

func calcute (_ math:mathExpor )->Int{
    switch math {
    case let .num(i):
        return i
    case let .sum(i, j):
        return calcute(i)+calcute(j)
    case let .difference(i, j):
        return calcute(i)-calcute(j)
    }
    
}
print(calcute(difference)) //10

5、MemoryLayout 獲取數據類型占用的內存大小

enum passWord{
    case num(Int,Int,Int,Int) // int 8字節 * 4 = 32
    case  string              // 分配一個字節
}
print(MemoryLayout<passWord>.stride) //40 分配占用空間大小
print(MemoryLayout<passWord>.size) //33 實際占用空間大小
print(MemoryLayout<passWord>.alignment) //8 對齊參數

var pwd  = passWord.string
print(MemoryLayout.size(ofValue: pwd))  // 33
print(MemoryLayout.stride(ofValue: pwd)) //40
print(MemoryLayout.alignment(ofValue: pwd)) //8
pwd = .num(100, 1, 2, 40)
print(MemoryLayout.size(ofValue: pwd))  // 33
print(MemoryLayout.stride(ofValue: pwd)) //40
print(MemoryLayout.alignment(ofValue: pwd)) //8

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM