iOS高级开发工程师面试——Swift
iOS高级开发工程师面试——Swift
- 一、Swift 和 OC
- 1. swift 和 OC 的联系
- 2. swift 相对于 OC 的优势
- 3. swift 优缺点
- 二、Swift 的可选项类型(Optionals)
- 三、Swift 中的 struct 和 class
- 四、swift 中 defer、guard?
- 1. **defer**
- 2. **guard**
- 五、Swift 中高阶函数有哪些?
- 1. **map**
- 2. **flatMap**
- 3. **filter**
- 4. **reduce**
- 六、Swift 为什么将String,Array,Dictionary设计成值类型?
- 七、Swift 中的 async/await?
- 1. async
- 2. await
- 八、Swift 消息派发机制有几种?详细说说。
一、Swift 和 OC
1. swift 和 OC 的联系
swift
和 OC 共用一套运行时环境,swift 和 OC 可以互相桥接
,互相引用
混合编程;- OC 中很多类库,在 swift 中依然可以直接使用,只是语法上有些改变;
- OC 中的
计数器
、ARC
、属性
、协议
、接口
、初始化
、扩展类
、命名参数
、匿名函数
等绝大多数概念,在 swift 中继续有效。 - swift 中有 OC 没有的一些概念。比如:
元组
,泛型
,函数式编程模式
(如 map、filter、reduce 等)等。
2. swift 相对于 OC 的优势
swift
容易阅读,语法和文件结构简洁化。swift
更容易维护,文件分离后结构更清晰。swift
更加安全,它是类型安全
的语言。swift
代码更少,语法更简洁,可以省去大量冗余的代码。swift
速度更快,运算性能更高。
3. swift 优缺点
优点:
- 语法更简洁
- 报错精准(报错的时候直接显示报错行)
- 定义变量简单(定义变量不用区分整型,浮点型等等,变量使用var,常量使用let。)
- 可视化互动效果(开发工具带来了Xcode Playgrounds功能,该功能提供强大的互动效果,能让Swift源代码在撰写过程中实时显示出其运行结果。)
- 函数式编程的支持(Swift 语言本身提供了对函数式编程的支持;Objc 本身是不支持的,通过引入 ReactiveCocoa 这个库才可支持函数式编程。)
缺点:
- Swift目前还没有得到全面性的推广
- Swift 暂时还不稳定,在 Swift 5.0 之前 API 不稳定,之后变得稳定
- .第三方库的支持不够多
- App体积变大( App 体积大概增加
5-8 M
左右) - 上线方式改变(在上线的时候,不能使用application Loader上传包文件,会提示你丢失了swift support files,应该使用xcode直接上传。)
二、Swift 的可选项类型(Optionals)
swift
引用了可选项类型
,用于处理变量值不存在
的情况。
Optionals
类似于 OC 中指向 nil 的指针
,但是适用于所有的数据类型,而非仅仅局限于类,Optionals 相比于 OC 中的 nil 指针 ,更加安全和简明,并且也是 swift 诸多最强大功能的核心。
三、Swift 中的 struct 和 class
- 相比于 OC 中的结构体,Swift 对结构体的使用比重大了很多,结构体成了实现面向对象的重要工具。
- 相比于 C++ 和 OC 中的结构体只能定义一组相关的成员变量,在 Swift 不仅可以定义成员变量(属性),还可以定义成员方法。 因此在 Swift 中,我们可以把结构体看做是一种轻量级的类。
- Swift 中结构体不具有继承性,也不具备运行时类型强制转换、使用析构器和使用引用计等能力
- Swift 中
struct
是值类型,而class
是引用类型
值类型的变量直接包含他们得数据,而引用类型的变量存储对他们的数据引用。
因此引用类型的变量被称为对象,因此对一个变量操作可能影响另一个变量所引用的对象。
而对于值类型都有他们自己的数据副本,因此对一个值类型的变量操作不可能影响到另一个值类型的变量。
四、swift 中 defer、guard?
1. defer
defer
关键字提供了一个安全和简便的方式来处理这件事,当离开
当前的代码块时,会执行defer对应的代码块。
func openFileAction(){///打开文件openFile()defer{