目录
枚举的基本用法
1、定义方式1
enum Direction{
case north
case south
case east
case west
}
var dir = Direction.west
dir = Direction.east
dir = .north
print(dir)
2、定义方式2
enum Direction2{
case north,south,east,west
}
let dir2 = Direction2.east
print(dir2)
switch dir2 {
case .north:
print("north")
case .south:
print("south")
case .east:
print("east")
case .west:
print("west")
}
枚举关联值
一、枚举关联值
enum Score{
case points(Int)
case grade(Character)
}
var sc = Score.points(96)
sc = .grade("A")
switch sc {
case let .points(i):
print(i,"points")
case let .grade(i):
print(i,"grade")
}
//输出
//A grade
二 、枚举关联值
enum Date{
case digit(year:Int,month:Int,day:Int)
case string(String)
}
var date = Date.digit(year:2019,month:9,day:10)
date = .string("2019-9-10")
switch date {
case .digit(let year,let month,let day):
print(year,month,day)
case .string(let i):
print(i)
}
//输出
//2019-9-10
枚举原始值
1、原始值
do{
enum Grade:String{
case perfect = "A"
case great = "B"
case good = "C"
case bad = "D"
}
var grade = Grade.perfect
grade = Grade.good
print(grade)//good(原始值)
switch grade {
case .perfect:
print(grade.rawValue)//C(隐式原始值)
case .great:
print(grade.rawValue)
case .good:
print(grade.rawValue)
case .bad:
print(grade.rawValue)
}
}
2、隐式原始值 String
do{
enum Grade:String{
case perfect,great,good,bad
}
let grade = Grade.great
print(grade)//great
switch grade {
case .perfect:
print(grade.rawValue)//great
default:
print(grade.rawValue)
}
}
3、隐式原始值 Int
enum Season:Int{
case spring = 1,summer,autumn = 4,winter
}
print(Season.spring)//spring
print(Season.summer.rawValue,Season.winter.rawValue)//2 5
}
递归枚举
func enumRecursion() -> Void {
//1、使用举例
indirect enum ArithExpr{
case number(Int)
case sum(ArithExpr,ArithExpr)
case difference(ArithExpr,ArithExpr)
}
func calculate(_ expr:ArithExpr)->Int{
switch expr {
case let .number(value):
return value
case let .sum(left,right):
return calculate(left) + calculate(right)
case let .difference(left,right):
return calculate(left) - calculate(right)
}
}
let five = ArithExpr.number(5)
let four = ArithExpr.number(4)
let two = ArithExpr.number(2)
let sum = ArithExpr.sum(five,four)
let difference = ArithExpr.difference(sum,two)
print(calculate(difference))
}
memorylayout的使用
func memorylaoutUse() -> Void {
//1、查看类型的内存占用
let a5 = 10
print(MemoryLayout<Int>.size) //8
print( MemoryLayout<Int>.stride) //8
print(MemoryLayout<Int>.alignment) //8
print(MemoryLayout.size(ofValue: a5)) //8
print( MemoryLayout.stride(ofValue: a5)) //8
print(MemoryLayout.alignment(ofValue: a5)) //8
//2、查看枚举的内存占用(关联值)
enum Password{
case num(Int,Int,Int,Int)
case other
case other2
}
print(MemoryLayout<Password>.size)//33 实际占用的内存大小
print(MemoryLayout<Password>.stride)//40 分配的内存大小
print(MemoryLayout<Password>.alignment)//8 对齐参数
let num = Password.num(0, 1, 2, 3)
let other = Password.other
print(MemoryLayout.size(ofValue: num))//33
print(MemoryLayout.size(ofValue: other))//33
//3、查看枚举的内存占用(原始值)
enum Season5{
case spring,summer,autumn,winter
}
print(MemoryLayout<Season5>.size)//1
print(MemoryLayout<Season5>.stride)//1
print(MemoryLayout<Season5>.alignment)//1
enum Season52:Int{
case spring = 1,summer,autumn,winter
}
print(MemoryLayout<Season52>.size)//1
print(MemoryLayout<Season52>.stride)//1
print(MemoryLayout<Season52>.alignment)//1
let sea:Season52 = Season52.autumn
print(MemoryLayout.size(ofValue: sea))//1
}
行者常至,为者常成!