//{
// 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
*/