Swift面试题集合

1.swift中结构体和类的对比(相同和区别)

1.相同点:

  • 定义属性用于存储值
  • 定义方法用于提供功能
  • 定义下标操作用于通过下标语法访问它们的值
  • 定义构造器用于设置初始值
  • 通过扩展以增加默认实现之外的功能
  • 遵循协议以提供某种标准功能
    2.区别
  • 类有继承的特性,而结构体没有
  • 类型转换使您能够在运行时检查和解释类实例的类型
  • 类有析构函数用来释放其分配的资源
  • 引用计数允许对一个类实例有多个引用

3.内存上的区别

  • 1.类是引用类型,是一个类类型的变量存储的是当前实例内存地址的引用
  • 2.结构体是一个典型的值类型,是存储的具体的实例,可以理解成具体的值
  • 3

总结:本质区别


2.存储属性和计算属性的区别
  • 存储属性用来进行数据的存储, 需要分配内存空间.
  • 计算属性用来定义计算的过程, 不需要分配空间.

3.static和class的区别
  • a.static可以修饰属性和方法,但是修饰的属性和方法不能被重写。修饰的方法叫静态方法<===>(class可以修饰计算属性和方法,但是不能修饰存储属性)
  • b.static可以在类、结构体、枚举中使用.修饰的方法叫类方法,可以被重写
  • c.class只能在类中使用

扩展:

oc中的static
可以修饰全局变量和局部变量


4.Swift是面向对象还是函数式的编程语言?
回答:Swift 既是面向对象的,又是函数式的编程语言。

  • (1).说 Swift 是面向对象的语言,是因为 Swift 支持类的封装、继承、和多态,从这点上来看与 Java 这类纯面向对象的语言几乎毫无差别。
  • (2).说 Swift 是函数式编程语言,是因为 Swift 支持 map, reduce, filter, flatmap 这类去除中间状态、数学函数式的方法,更加强调运算结果而不是中间过程

5.比较以下关键词:Open, Public, Internal, File-private, Private

  • Swift 有五个级别的访问控制权限,从高到底依次为比如 Open, Public, Internal, File-private, Private
  • 遵循的基本原则是:高级别的变量不允许被定义为低级别变量的成员变量
对比.png

6.strong, weak, unowned关键字的对比

  • strong 代表着强引用,是默认属性。当一个对象被声明为 strong 时,就表示父层级对该对象有一个强引用的指向。此时该对象的引用计数会增加1。
  • weak 代表着弱引用。该对象的引用计数不会增加1。它在对象释放后弱引用也随即消失。继续访问该对象,程序会得到 nil,不会崩溃
  • unowned 与弱引用本质上一样。唯一不同的是,对象在释放后,依然有一个无效的引用指向对象,它不是 Optional 也不指向 nil。如果继续访问该对象,程序就会崩溃。
    加分回答:
  • weak 和 unowned 的引入是为了解决由 strong 带来的循环引用问题
  • weak 和 unowned 的使用场景有如下差别:
    • 当访问对象时该对象可能已经被释放了,则用 weak。比如 delegate的修饰
    • 当访问对象确定不可能被释放,则用 unowned。比如self 的引用
    • 为了安全起见,很多公司规定任何时候都使用 weak 去修饰.

  1. Swift为什么将String,Array,Dictionary设计成值类型?
    oc中的String,Array,Dictionary是引用类型.
  • 值类型相比引用类型,最大的优势在于内存使用的高效.
    值类型在栈上操作引用类型在堆上操作。栈上的操作仅仅是单个指针的上下移动,而堆上的操作则牵涉到合并、移位、重新链接等
  • 为了线程安全考虑。通过Swift的let设置,使得这些数据达到了真正意义上的“不变”,它也从根本上解决了多线程中内存访问和操作顺序的问题。
  • 设计成值类型还可以提升API的灵活度。例如通过实现Collection这样的协议,我们可以遍历String,使得整个开发更加灵活高效。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容