1.值类型和引用类型的区别? Array, String, Dictionary在Swift中属于什么类型? 是如何处理的?
值类型和引用类型最基本的分别在赋值之后的结果。当一个值类型被赋值的时候,相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响
在Swift里面,数组(Array)、字符串(String)、字典(Dictionary)都属于值类型
Array, String, Dictionary在每次使用的时候都会被复制一份
2.Swift中有哪些高阶函数? 有几种map函数? 有什么不同?
map, filter, reduce
map: 数组中每个元素通过某种规则(闭包实现) 进行转换,最后返回一个新的数组
flatMap: 能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组,称为降维,通俗一点就是把多维数组都会拍扁为一维数组
compactMap 和flatMap类似,不过compactMap会将nil剔除,并对Optional进行解包
filter用来过滤元素,即筛选出数组元素中满足某种条件(闭包实现) 的元素
reduce两个函数都是把数组元素组合计算为另一个值,并且会接受一个初始值,这个初始值的类型可以和数组元素类型不同
3. guard和defer使用场景
defer语句在代码块(方法、闭包等,可以理解为大括号包装起来的代码)作用域退出之前执行,也就是代码块中其他应该执行的代码都执行完了,才执行defer中的代码
一个代码块允许多个defer,多个defer执行的顺序从后到前
defer使用场景:
1. 代码块执行完之后,清理资源
2.try catch 结构, 无论是否抛出错误, 都可以执行到defer
guard使用场景:
1. 当一些先决条件不满足,后续代码没必要执行的情况下,就应该去使用 guard。比如,在 登录页面。先决条件就是用户必须填写用户名和密码。如果这两项任意一项为空,那后面的登录逻辑是没必要再去执行的。
当一些业务代码,在不满足某些条件的情况下,也需要执行的时候,就要用的if了