swift中的枚举可以用复杂的类型如下,关联值:
在Swift中进行枚举布局的时候一直是尝试使用最少的空间来存储enum,对于当前的case数量来说,UInt8能够表示256cases,也就意味着如果一个默认枚举类型且没有关联值的case少于256,当前枚举类型的大小都是1字节。
indirect 关键字的使用
indirect作用就是把后面的BinaryTree分配到堆空间里:这个关键字一般用在递归里。
Optional可选型
之前我们在写代码的过程中早就接触过可选型,比如我们在代码这样定义:
当前的age我们就称之为可选值,当然可选值的写法这两者是等同的。
对于Optional的本质是什么?我们直接跳转到源码,打开Optional.swift文件,其就是一个枚举。
可选链
我们都知道在OC中我们给一个nil对象发送消息什么也不会发生,swift中我们是没有办法向一个nil对象直接发送消息,但是借助可选链可以达到类似的效果。
可选链就是如下,当其无初始值时候也不会报错
同样的可选链对于下标和函数调用也适用
如下:
??运算符(空合并运算符)
(a ?? b)将对可选类型 a 进行空判断,如果a包含一个值就进行解包,否则就返回一个默认值b。
1)表达式 a 必须是 Optional类型
2)默认值 b 的类型必须要和a存储值的类型保持一致
运算符重载
在源码中我们可以看到除了重载了 ?? 运算符,Optional类型还重载了 ==,?=等等运算符,实际开发中我们可以通过重载运算符简化我们的表达式,下面是重载定义了---符号。
隐式解析可选类型
隐式解析可选类型是可选类型的一种,使用的过程中和非可选类型无异。它们之间唯一的区别是,隐式解析可选类型是你告诉对Swift编译器,我在运行时访问时,值不会为nil。如果为nil的话回闪退。
var age:Int
var age1: Int !(这个age1已经隐式解包)
其实日常开发中我们比较常见这种隐士解析可选类型
IBOutlet类型时Xcode强制为可选类型的,因为它不是在初始化时赋值的,而是在加载视图的时候。你可以把设置为普通可选类型,但是如果这个视图加载正确,它是不会为空的。
与可选值有关的高阶函数
1)map:这个方法接受一个闭包,如果可选值有内容则调用这个闭包进行转换
上面的代码中我们从字典中取出字符串“1”,并将其转换为int类型,但因为String转换成int不一定成功,所以返回的是int?类型,而且字典通过键不一定能取得到值,所以map返回的也是一个Optional,所以最后上述代码result的类型为int??类型。
那么如何把我们的双重可选展平开来,这个时候我们就需要使用到
1)flatMap:可以把结果展平成为单个可选值 (下面用了Int(S0)把其转换成了int类型)
2)注意,这个方法是作用在Optinal的方法,而不是作用在Sequence上的
3)作用在Sequence上的flatMap方法在Swift4.1中被更名为compactMap。该方法可以将序列中的nil过滤出去。
元类型,AnyClass,Self (self)
1)AnyObject:代表任意类的 instance,类的类型,仅类遵守的协议。
2)Any:代表任意类型,包括funcation类型或者 Optional类型
3)AnyClass :代表任意实例的类型