关联值
enum Score{
case english(Int)
case math(Int)
case Class(grade:Int,name:String)
case block((()->())?)
}
//let scoreType = Score.Class((grade: 3, name: "二班"))
let scoreType = Score.block {
//同样可以放闭包
print("闭包回调")
}
switch scoreType {
case .english(let yingyu):
print(yingyu)
case .math(let shuxue):
print(shuxue)
case let .Class(nianji,banji)://let或var可以写到前面
print(nianji)
print(banji)
case .block(let block):
block?()
}
//打印结果 闭包回调
原始值
enum type:STring{…}
这里面的 : 并不是代表继承.代理而是代表原始值的类型
enum season:Int{
case chun,xia,qiu = 4,dong
}
print(season.chun.rawValue)
print(season.dong.rawValue)
//0 5
如果原始值是Int或者string,会自动分配原始值
MemoryLayout
MemoryLayout 计算变量所占空间等
MemoryLayout<persion>.size //实际所占用的大小
MemoryLayout<Int>.stride //分配的空间大小,一定是内存对齐参数的倍数 8
MemoryLayout.alignment(ofValue:Int) //内存对齐参数 8
枚举所占内存大小
enum Season:Int{
case chun = 0,xia,qiu = 4,dong
}
enum Persion{
case xinxi(name:String,age:Int)
}
var 原始值 = Season.chun
var 关联值 = Persion.xinxi(name: "asd", age: 18)
MemoryLayout.size(ofValue: 原始值) //1
MemoryLayout.stride(ofValue: 原始值)//1
MemoryLayout.alignment(ofValue: 原始值)//1
MemoryLayout.size(ofValue: 关联值) //string占16个字节 Int占8位 24
MemoryLayout.stride(ofValue: 关联值)//24
MemoryLayout.alignment(ofValue: 关联值)//8
原始值不会存储到枚举变量内部,关联值会存储到变量内部
enum Persion{
case xinxi(String,Int,Int,Int)
case a,b
}
如果枚举的关联值中含有string类型 (string占16个字节),增加case不会增加内存开销//40字节
enum Persion{
case xinxi(Int,Int,Int,Int)
case a,b
}
多个case 内存会多 分配一个字节来区分case,只有一个case 则不会分配
enum Persion{
case name
}
此时分配空间为1,但实际所占内存为0,因为只有一个case 不需要占用一个字节来区分case
双重可选项
var num1:Int? = 10
var num2:Int?? = num1
var num3:Int?? = 10
print(num2 == num3)//true
双重可选项相当于一个壳子里面放了另一个盒子
num2是一个盒子,盒子里面放了一个num1的一个盒子,num1解包 == 10
num3是将10放到了最里面的盒子
用lldb查看原始结构

var num1:Int? = nil
var num2:Int?? = num1
var num3:Int?? = nil
print(num2 == num3) //false
num2是一个放了一个空盒子的盒子
num3是一个空盒子
两者差了一个盒子

网友评论