iOS 基础知识总结之Swift篇

184 阅读4分钟

1.  Swift 语言的特性,与OC语言相比有什么相同和不同点,为什么选择使用Swift语言作为项目开发语言。

Swift语言是一个静态语言,类型更安全的语言,会在编译期间检查数据类型,而OC是一门动态语言,类型是在运行时才确定的。

Swift语言作为一门现代语言,在语法上更现代和简洁,支持新的编程概念,例如类型推断、元组、可选类型等。

Swift语言在编译时,可以进行更多的编译时优化,提高代码的运行效率。

Swift语言可以使用一些高阶函数,如fillter/map/flatMap/reduce等。

Swift也是苹果主推的语言,最新的SwiftUI框架,也是用Swift语言支持开发。

2.  Swift语言的泛型

泛性:可以根据自定义的需求,编写灵活、可复用的函数及类型。

associateType 是协议的中使用的泛型

3.  Swift 为什么将 String,Array,Dictionary设计成值类型?

1.  安全性上会有所提升,因为这些数据的传递,会进行一份值的复制,避免了数据竞争和同步的问题

2.  值类型存储在栈上,栈上的内存分配和回收效率比堆上的要快的多,值类型没有复杂的引用计数,也可以提升性能和减少内存的开销

3.  swift编译器对值类型做了优化,编译器会尝试将值类型存储空间优化尽可能小,只有在必要时才进行实际的拷贝操作(copy-on-Write), 只有在修改数据时才会真正复制。

4.  不透明类型

当你想返回一个隐藏类型时,比如SwiftUI中的some View,举例说明比如一个shape协议,draw()后,可能返回正方形,可能圆形,但是都是遵循shape协议的一种类型。而泛型则是返回一种具体明确的类型。

5.  内存访问冲突

最常见是在多线程,访问同一个内存时会出现。单线程的话,经常会在in out类型参数时会出现。主要出现在同时对同一块内存,进行写操作的时候。

6.  Swift中的并发和OC的GCD

Swift中的并发是引入了Concurrency框架,可以在方法后面加上修饰符 aync,加上aync的方法,在调用时可以可以加上await关键词,表示当前异步方法悬停点。同步代码中调用时可以加入Task。为了防止线程进行,导致内存访问安全问题,可以在访问数据类型前加上actor关键词,可以保证访问此数据时,是线程安全的,加上actor关键词后,Swift会保证访问此类型内存时,只有一个线程。

7.  final

限制继承和重写的关键词。

8.  对于面向协议开发的理解

面向协议对于iOS开发来说,实现了OC无法进行多继承的功能。也使项目结构变得更为模块化,协议理解成能力,就是你需要某一项能力,那么你就遵循这个协议,并且实现我需要你实现的方法,属性等等。与其他语言的接口有类似的效果。

9.  Swift中Weak和Unowed的区别

weak和unowed都是用来打破循环引用的关键词,将被引用的对象的设置为弱引用,都不增加引用计数。它们之间的区别是,当被引用的对象被释放时,被weak修饰的对象会置为nil,而被unowed修饰的对象会依然持有被修饰对象的地址,从而导致奔溃。所以除非我们可以保证此闭包在被unowned修饰的对象的生命周期内存在,否则就使用weak修饰符。

10.  对Struct和Class的理解

1.  Struct属于值类型,而Class属于引用类型,Struct分布在栈区而Class则是分布在堆区,在数据的读取上来说,Struct更具有优势。

2.  Struct值类型天然线程安全,相较于Class类型的话,数据的读取会更安全,可以避免出现线程竞争的问题。

3.  值类型没有没有引用计数,也不会出现类似于Class类型的内存泄漏问题。

4.  Swift对值类型做了copy-on-write的优化,减少不必要的存储开销。