美文网首页
swift枚举,memonyLayout,多重可选项

swift枚举,memonyLayout,多重可选项

作者: 卡卡罗忒 | 来源:发表于2020-04-23 00:00 被阅读0次

关联值

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查看原始结构


image.png
var num1:Int? = nil
var num2:Int?? = num1
var num3:Int?? = nil
print(num2 == num3) //false

num2是一个放了一个空盒子的盒子
num3是一个空盒子
两者差了一个盒子


image.png

相关文章

网友评论

      本文标题:swift枚举,memonyLayout,多重可选项

      本文链接:https://www.haomeiwen.com/subject/okdnihtx.html