IOS面试题——Swift数据类型,常量、变量、元组(1)

一 面试题汇总

  1. 值类型和引用类型区别,swift中值类型有哪些,引用类型有哪些。和OC相比有什么区别?
  2. Optional可选类型属于引用类型还是值类型?如何实现的
  3. 常量和变量分别如何声明?
  4. 可选类型解包方式有哪些?
  5. 多重可选项的情况是怎么处理的?
  6. 什么是可选链?可选链的结果是可选项么?
  7. 什么是元组,元组能做什么?
  8. 什么是字面量,字面量协议可以做什么?

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

2.1 值类型和引用类型区别,swift中值类型有哪些,引用类型有哪些。和OC相比有什么区别?

1
2
3
值类型在赋值时会复制数据,适用于不需要共享状态的场景,常见的有结构体、枚举等。
引用类型在赋值时共享同一个实例,修改一个引用会影响所有引用,常见的有类、闭包、函数等。
与 Objective-C 相比,Swift 更加强调值类型的使用,使得数据传递更加安全、高效。

2.2 Optional可选类型属于引用类型还是值类型?如何实现的

1
2
3
Optional 是 值类型,它通过 枚举 来实现。
即使 Optional 内部可能包含引用类型的值(如 Optional<String>),Optional 本身依然是值类型。
赋值和传递 Optional 时,实际上传递的是其副本,而不是引用。

2.3 常量和变量分别如何声明?

1
2
常量:使用 let 关键字声明,一旦赋值后不能再修改。
变量:使用 var 关键字声明,值可以随时修改。

2.4 可选类型解包方式有哪些?

1
2
3
4
5
6
7
1.强制解包(!):直接解包,但如果值为 nil 会崩溃。
2.可选绑定(if let、guard let):安全解包,只有在值不为 nil 时才解包,避免崩溃。
3.可选链式调用(?.):当值为 nil 时返回 nil,避免崩溃。
4.默认值(??):如果可选值为 nil,提供一个默认值。
5.隐式解包可选类型(!):声明时标记为隐式解包,但在使用时自动解包,仍需注意 nil 的情况。

选择解包方式时,应根据具体的需求和安全性考虑,尽量避免强制解包,推荐使用可选绑定或可选链式调用。

2.5 多重可选项的情况是怎么处理的?

1
2
3
4
5
6
7
8
处理多重可选项时,可以使用以下方式:

1.强制解包(!!):强制解包两次,但如果其中任何一层是 nil,会导致崩溃。
2.可选绑定(if let 或 guard let):安全解包,通过逐层解包确保每一层都不为 nil。
3.可选链式调用(??):简洁地解包多重可选项,若任何一层为 nil,则返回 nil。
4.默认值(?? 运算符):如果多重可选项为 nil,使用默认值。

多重可选类型的解包需要注意每一层是否为 nil,推荐使用 可选绑定 和 可选链式调用 来确保代码的安全性。

2.6 什么是可选链?可选链的结果是可选项么?

1
2
3
4
5
6
7
可选链:
是用来安全地访问可选类型的属性、方法或下标的机制。
当可选类型的值为nil时,整个调用会返回nil,而不会崩溃。

可选链的结果是可选项:无论链式调用是否成功,结果总是一个可选类型,即使结果本身是一个具体值。

可选链可以提高代码的简洁性和安全性,减少了对可选值的繁琐解包操作。

2.7 什么是元组,元组能做什么?

1
2
3
4
5
6
元组是一种非常有用的复合类型,能够方便地将不同类型的值组合在一起进行操作。它常用于:

1.组合不同类型的数据。
2.函数返回多个值。
3.临时存储多个相关值。
4.提高代码可读性和简洁性。

2.8 什么是字面量,字面量协议可以做什么?

1
2
3
4
5
6
7
字面量(Literal) 是编程语言中的一种表达式,表示固定值。
它直接表示某种数据类型的值,而不需要通过变量、常量或函数计算得出。
例如,在 Swift 中,整数 42 或字符串 "Hello" 就是字面量

字面量协议允许类型通过字面量(如整数、字符串、数组等)来初始化实例。
通过实现相关协议(如 ExpressibleByStringLiteral、ExpressibleByIntegerLiteral 等),
类型可以灵活地与字面量配合使用,从而简化初始化和提高代码的简洁性。

三 参考

  • 简书—Swift数据类型,常量、变量、元组