枚举

//{

//    enum Direction {

//        case north

//        case south

//        case east

//        case west

//    }

//}

//等同上面的写法

importFoundation

enum Direction {

    case north, south, east, west

}

vardir= Direction.north

dir= .east

print(dir)

//关联值 将枚举成员值和其他类型的值关联在一起

enum Score {

    casepoints(Int)

    case grade(Character)

}

varscore= Score.points(10)

score= .grade("A")

switch score {

caselet.points(i):

    print("poits\(i)")

caselet.grade(i):

    print("grade\(i)")

}

enum Date {

    casedigit(year:Int, month:Int,day:Int)

    casestring(String)

}

vardate=Date.digit(year:2022, month:1, day:25)

date = .string("2022-1-25")

switch date {

case.digit(letyear,letmonth,letday):

    print(year,month,day)

caselet.string(value):

    print(value)

}

//原始值

enum PokerSuit : Character {

casespade ="♠️"

caseheart ="♥️"

casediamond ="♦️"

caseclub ="♣️"


}

varsuit= PokerSuit.heart

print(suit,suit.rawValue,PokerSuit.club.rawValue)

/*隐式原始值(int string 类型swift会自动分配原始值)

 enum Direction : String{

     case north = "north"

     case south = "south"

     case east = "east"

     case west = "west"

 }

 //等同上面的写法

 enum Direction : String{

     case north, south, east, west

 }

 print(Direction.north)

 print(Direction.north.rawValue)

 */

//递归枚举 (常用)

indirect enum ArithExpr {

    casenumber(Int)

    casesum(ArithExpr,ArithExpr)

    casedifference(ArithExpr,ArithExpr)

}

//等同上面写法

//enum ArithExpr {

//    case number(Int)

//  indirect case sum(ArithExpr,ArithExpr)

//  indirect case difference(ArithExpr,ArithExpr)

//}

letfive= ArithExpr.number(5)

letfour= ArithExpr.number(4)

letthree= ArithExpr.number(3)

letsum= ArithExpr.sum(five, four)

letdifference= ArithExpr.difference(three,sum)

funccalculate(_expr : ArithExpr) ->Int{

    switchexpr {

    caselet.number(value1):

        returnvalue1

    caselet.sum(left1, right1):

        returncalculate(left1) + calculate(right1)

    caselet.difference(left1, right1):

        returncalculate(left1) - calculate(right1)

    }

}

calculate(difference)

//MemoryLayout 获取占用数据类型的内存大小

enum Password {

    case number(Int,Int,Int,Int)

    caseother

}

MemoryLayout<Password>.size    //33 实际用到的空间大小 32(8*4)关联值的内存 + 1(枚举的内存)

MemoryLayout.stride  //40 分配占用的空间大小

MemoryLayout<Password>.alignment//8  对齐参数

enum Season : Int{

    case spring = 8 ,summer, autumn

}

MemoryLayout.size    //1 实际用到的空间大小

MemoryLayout.stride  //1 分配占用的空间大小

MemoryLayout<Password>.alignment//1  对齐参数

/*

 枚举内存

 结论:

 如果枚举有关联值 那么内存就是关联值占用内存大小 + 枚举内存(1)

 如果枚举是原始值或者普通枚举 那么内存都是 1

 */

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容