IOS面试题——Swift属性,单例(5)

一 面试题汇总

  1. 什么是计算属性,什么是存储属性?只读计算属性,延迟存储属性呢?
  2. 枚举的原始值属于计算属性还是存储属性?
  3. 什么是属性观察器?willSet,didSet
  4. 实例属性和类型属性有什么区别?
  5. Swift单例如何实现?
  6. 存储类型属性有什么特点? 在什么时候初始化?多个线程同时访问呢?

二 面试题解答(仅供参考)

2.1 什么是计算属性,什么是存储属性?只读计算属性,延迟存储属性呢?

1
2
3
4
存储属性:直接存储一个值,保存在实例中。它可以是var或let,并且值会在对象生命周期内持久存在。
计算属性:不直接存储值,而是通过一些计算来返回值。它们具有getter和可选的setter,每次访问时计算返回的结果。
只读计算属性:只包含getter,不能直接修改,只能计算并返回值。
延迟存储属性:只有在首次访问时才会初始化存储的值,通常用于初始化过程较为复杂或开销大的属性。使用lazy关键字进行声明。

2.2 枚举的原始值属于计算属性还是存储属性?

1
2
枚举的原始值是一个 存储属性,它存储在每个枚举实例中,并且通过rawValue属性可以访问。
原始值一旦被赋值后,不会再进行计算,而是直接作为数据存在于实例中。

2.3 什么是属性观察器?willSet,didSet

1
2
3
4
5
6
7
8
9
10
属性观察器是一种用于监视和响应属性值变化的机制,
在 Swift 中,可以通过 willSet 和 didSet 来实现属性观察器。

1-willSet:在属性值即将发生改变之前被调用,可以在 willSet 中访问新值,
也可以使用默认参数名 newValue。
2-didSet:在属性值已经发生改变之后被调用,可以在 didSet 中访问旧值,
也可以使用默认参数名 oldValue。

属性观察器可以用于检测属性值的变化,并在值变化时执行特定的代码。
这种机制使得我们可以在属性值发生变化时进行一些额外的操作,例如更新用户界面、触发其他事件等。

2.4 实例属性和类型属性有什么区别?

1
2
实例属性:每个实例有自己的属性值,通常用于描述实例的状态。
类型属性:类、结构体或枚举本身拥有的属性,所有实例共享同一个值,通常用于描述类型的共享状态。

2.5 Swift单例如何实现?

1
2
3
4
5
6
Swift 提供了简单的方式来实现单例模式,最常见的方法是使用静态常量和 dispatch_once
(但在 Swift 中,dispatch_once 已经被 static 常量初始化所替代)。

使用 static let 实现单例是最推荐的方式。
通过 private init() 来防止外部创建多个实例。
这种实现方式在 Swift 中是线程安全的,且简洁高效。

2.6 存储类型属性有什么特点? 在什么时候初始化?多个线程同时访问呢?

1
存储类型属性在第一次访问时初始化,static let 线程安全,static var 需自行确保线程安全。

三 参考

  • 简书—Swift属性,单例