美文网首页
聊几个swift的面试题

聊几个swift的面试题

作者: hello_bear | 来源:发表于2020-05-07 16:28 被阅读0次

1、 struct和class的区别

在 Swift 中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。所以他们两者之间的区别就是两个类型的区别。举个简单的例子,代码如下:

class Temperature {
  var value: Float = 37.0
}

class Person {
  var temp: Temperature?

  func sick() {
    temp?.value = 41.0
  }
}

let A = Person()
let B = Person()
let temp = Temperature()

A.temp = temp
B.temp = temp

A.sick()

上面这段代码,由于 Temperature 是 class ,为引用类型,故 A 的 temp 和 B 的 temp指向同一个对象。A 的 temp修改了,B 的 temp 也随之修改。这样 A 和 B 的 temp 的值都被改成了 41.0。如果将 Temperature 改为 struct,为值类型,则 A 的 temp 修改不影响 B 的 temp。

内存中,引用类型诸如类是在堆(heap)上,而值类型诸如结构体是在栈(stack)上进行存储和操作。相比于栈上的操作,堆上的操作更加复杂耗时,所以苹果官方推荐使用结构体,这样可以提高 App 运行的效率。
加分回答:

class 有这几个功能 struct 没有的:

  • class 可以继承,这样子类可以使用父类的特性和方法;
  • 类型转换可以在 runtime 的时候检查和解释一个实例的类型;
  • 可以用 deinit 来释放资源;
  • 一个类可以被多次引用。

struct 也有这样几个优势:

  • 结构较小,适用于复制操作,相比于一个 class 的实例被多次引用更加安全;
  • 无须担心内存 memory leak 或者多线程冲突问题。

2、swift的管理权限

Swift 有五个级别的访问控制权限,从高到底依次为比如 Open, Public, Internal, File-private, Private。

他们遵循的基本原则是:高级别的变量不允许被定义为低级别变量的成员变量。比如一个 private 的 class 中不能含有 public 的 String。反之,低级别的变量却可以定义在高级别的变量中。比如 public 的 class 中可以含有 private 的 Int。

  • Open 具备最高的访问权限。其修饰的类和方法可以在任意 Module 中被访问和重写;它是 Swift 3 中新添加的访问权限。
  • Public 的权限仅次于 Open。与 Open 唯一的区别在于它修饰的对象可以在任意 Module 中被访问,但不能重写。
  • Internal 是默认的权限。它表示只能在当前定义的 Module 中访问和重写,它可以被一个 Module 中的多个文件访问,但不可以被其他的 Module 中被访问。
  • File-private 也是 Swift 3 新添加的权限。其被修饰的对象只能在当前文件中被使用。例如它可以被一个文件中的不同 class,extension,struct 共同使用。
  • Private 是最低的访问权限。它的对象只能在定义的作用域内及其对应的扩展内使用。离开了这个对象,即使是同一个文件中的对象,也无法访问。

3、协议和extention的区别

  • extension允许我们为已有协议增加方法或者增加方法的默认实现。
  • swift protocol中显示声明的方法,必须实现,但extension提供了默认实现的方法,实例类型可以不提供显示的具体实现(隐示实现了extension的实现)。
  • extension的默认实现可以让方法变为可选,即实例不需要提供最终实现。
  • 如果方法没有在protocol中显示的声明,类型推断得到是实例类型将会调用实例的最终实现(如果有,没有则调用extension中的默认实现),而如果类型推断的是协议类型,将会调用extension的默认实现。

4、冷信号与热信号的区别

  • Hot Observable是主动的,尽管你并没有订阅事件,但是它会时刻推送,就像鼠标移动;而Cold Observable是被动的,只有当你订阅的时候,它才会发布消息。

  • Hot Observable可以有多个订阅者,是一对多,集合可以与订阅者共享信息;而Cold Observable只能一对一,当有不同的订阅者,消息是重新完整发送。

相关文章

网友评论

      本文标题:聊几个swift的面试题

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