美文网首页
第三十篇:Swift枚举 & Optional

第三十篇:Swift枚举 & Optional

作者: 坚持才会看到希望 | 来源:发表于2022-12-10 23:18 被阅读0次

swift中的枚举可以用复杂的类型如下,关联值:


8521670676493_.pic.jpg

在Swift中进行枚举布局的时候一直是尝试使用最少的空间来存储enum,对于当前的case数量来说,UInt8能够表示256cases,也就意味着如果一个默认枚举类型且没有关联值的case少于256,当前枚举类型的大小都是1字节。

8531670677878_.pic.jpg

indirect 关键字的使用

indirect作用就是把后面的BinaryTree分配到堆空间里:这个关键字一般用在递归里。

8541670683985_.pic.jpg

Optional可选型

之前我们在写代码的过程中早就接触过可选型,比如我们在代码这样定义:

8591670753659_.pic.jpg

当前的age我们就称之为可选值,当然可选值的写法这两者是等同的。

8601670753711_.pic.jpg

对于Optional的本质是什么?我们直接跳转到源码,打开Optional.swift文件,其就是一个枚举。

8611670754063_.pic.jpg

可选链

我们都知道在OC中我们给一个nil对象发送消息什么也不会发生,swift中我们是没有办法向一个nil对象直接发送消息,但是借助可选链可以达到类似的效果。

可选链就是如下,当其无初始值时候也不会报错

8621670756235_.pic.jpg

同样的可选链对于下标和函数调用也适用

如下:

8631670756728_.pic.jpg

??运算符(空合并运算符)

(a ?? b)将对可选类型 a 进行空判断,如果a包含一个值就进行解包,否则就返回一个默认值b。
1)表达式 a 必须是 Optional类型
2)默认值 b 的类型必须要和a存储值的类型保持一致

运算符重载

在源码中我们可以看到除了重载了 ?? 运算符,Optional类型还重载了 ==,?=等等运算符,实际开发中我们可以通过重载运算符简化我们的表达式,下面是重载定义了---符号。

image.png

隐式解析可选类型

隐式解析可选类型是可选类型的一种,使用的过程中和非可选类型无异。它们之间唯一的区别是,隐式解析可选类型是你告诉对Swift编译器,我在运行时访问时,值不会为nil。如果为nil的话回闪退。

var age:Int
var age1: Int !(这个age1已经隐式解包)

其实日常开发中我们比较常见这种隐士解析可选类型

8641670768126_.pic.jpg

IBOutlet类型时Xcode强制为可选类型的,因为它不是在初始化时赋值的,而是在加载视图的时候。你可以把设置为普通可选类型,但是如果这个视图加载正确,它是不会为空的。

与可选值有关的高阶函数

1)map:这个方法接受一个闭包,如果可选值有内容则调用这个闭包进行转换

8651670769569_.pic.jpg

上面的代码中我们从字典中取出字符串“1”,并将其转换为int类型,但因为String转换成int不一定成功,所以返回的是int?类型,而且字典通过键不一定能取得到值,所以map返回的也是一个Optional,所以最后上述代码result的类型为int??类型。

那么如何把我们的双重可选展平开来,这个时候我们就需要使用到

1)flatMap:可以把结果展平成为单个可选值 (下面用了Int(S0)把其转换成了int类型)

8661670769894_.pic.jpg

2)注意,这个方法是作用在Optinal的方法,而不是作用在Sequence上的

3)作用在Sequence上的flatMap方法在Swift4.1中被更名为compactMap。该方法可以将序列中的nil过滤出去。

8671670770246_.pic.jpg

元类型,AnyClass,Self (self)

1)AnyObject:代表任意类的 instance,类的类型,仅类遵守的协议。
2)Any:代表任意类型,包括funcation类型或者 Optional类型
3)AnyClass :代表任意实例的类型

相关文章

网友评论

      本文标题:第三十篇:Swift枚举 & Optional

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