文章

Swift面试题

1.Objective-C与Swift的异同?

swift和OC的共同点:

  • OC出现过的绝大多数概念,比如引用计数、ARC(自动引用计数)、属性、协议、接口、初始化、 扩展类、命名参数、匿名函数等,在Swift中继续有效(可能最多换个术语)。
  • Swift和Objective-C共用一套运行时环境,Swift的类型可以桥接到Objective-C(下面我简称OC), 反之亦然

swift的优点:

  • swift注重安全,OC注重灵活
  • swift注重面向协议编程、函数式编程、面向对象编程,OC注重面向对象编程
  • swift注重值类型,OC注重指针和引用
  • swift是静态类型语言,OC是动态类型语言
  • swift容易阅读,文件结构和大部分语法简易化,只有.swift文件,结尾不需要分号
  • swift中的可选类型,是用于所有数据类型,而不仅仅局限于类。相比于OC中的nil更加安全和简明
  • swift中的泛型类型更加方便和通用,而非OC中只能为集合类型添加泛型
  • swift中各种方便快捷的高阶函数(函数式编程) (Swift的标准数组支持三个高阶函数:map, filter和reduce,以及map的扩展flatMap)
  • swift新增了两种权限,细化权限。open > public > internal(默认) > fileprivate > private
  • swift中独有的元组类型(tuples),把多个值组合成复合值。元组内的值可以是任何类型,并不要求是相同 类型的。
  • swift中函数可以当作参数或返回值,OC中不可以。

2. 类(class) 和 结构体(struct) 有什么区别? 类(class) 和 结构体(struct) 比较,优缺点?

二者的本质区别:

  • struct是值类型,class是引用类型 可以继承。
  • struct是深拷贝,拷贝的是内容;class是浅拷贝,拷贝的是指针。 (值类型的变量直接包含它们的数据,对于值类型都有它们自己的数据副本, 因此对一个变量操作不可能影响另一个变量。引用类型的变量存储对他们的数据引用, 因此后者称为对象,因此对一个变量操作可能影响另一个变量所引用的对象。)

相同点:

  • 都可以定义以下成员:属性、方法、下标、初始化器
  • 都支持类型扩展、协议

不同点:

  • 类支持继承和多态,结构体不支持
  • 类必须自己定义初始化器,结构体会有默认的按成员初始化器
  • 类支持析构器(deinit),结构体不支持
  • 类的实例在堆上,由ARC负责释放;结构体的实例在栈上,栈结束自动释放,不参与ARC管理
  • 变量赋值方式不同:struct是值拷贝;class是引用拷贝
  • immutable变量:swift的可变内容和不可变内容用var和let来甄别, 如果初始为let的变量再去修改会发生编译错误。struct遵循这一特性;class不存在这样的问题
  • mutating function: struct 和 class 的差別是 struct 的 function 要去改变 property 的值的时候要加上 mutating,而 class 不用。
  • 类支持引用相等比较(===于!==),结构体不支持

3. OC协议与Swift协议的区别

OC中的协议:

  1. 受限于委托代理的含义,多⽤于不同类之间的传值与回调。

Swift的协议:

  1. 可以通过协议 (extension) 扩展,实现协议的⽅法(OC不⾏)
  2. 定义属性⽅法
  3. 通过抽取不同类中的相同⽅法和属性,实现模块化减少耦合。使面向协议编程成为可能
  4. 不需要单独声明协议对象和指定代理
  5. 协议可以继承其他协议

  6. 什么是Swift编程语言?它有哪些特点和优势?
  7. Swift中的值类型和引用类型有什么区别?
  8. 什么是可选类型(Optional)?如何使用它们处理可能为空的值?
  9. 什么是自动引用计数(ARC)?它是如何管理内存的?
  10. Swift中的延迟初始化(Lazy Initialization)是什么?如何使用它?
  11. 什么是Swift中的闭包(Closure)?如何捕获值?
  12. Swift中的高阶函数(Higher-Order Functions)有哪些?举例说明使用高阶函数的场景。
  13. Swift中的协议(Protocol)是什么?如何定义和遵循一个协议?
  14. 什么是Swift中的扩展(Extension)?如何使用扩展添加功能?
  15. Swift中的委托模式(Delegate Pattern)是什么?如何实现委托?
  16. 什么是Swift中的泛型(Generics)?如何创建泛型函数和类型?
  17. Swift中的错误处理机制是什么?举例说明如何抛出和处理错误。
  18. 什么是Swift中的类型推断(Type Inference)?它是如何工作的?
  19. Swift中的访问控制有哪些级别?请解释每个级别的作用和使用场景。
  20. 什么是Swift中的逃逸闭包(Escaping Closure)?为什么需要使用@escaping关键字?
  21. Swift中的异步编程模型是什么?举例说明如何使用异步和await关键字。
  22. 什么是Swift中的懒加载(Lazy Loading)?如何使用它延迟加载对象?
  23. Swift中的协程(Coroutines)是什么?它们有什么优势?
  24. 什么是Swift中的函数式编程(Functional Programming)?举例说明如何在Swift中使用函数式编程思想。
  25. Swift中的操作符重载(Operator Overloading)是什么?如何重载操作符?
  26. 什么是Swift中的访问器(Accessors)?有哪些类型的访问器?
  27. Swift中的属性观察器(Property Observers)是什么?如何使用它们?
  28. 什么是Swift中的析构函数(Deinitializer)?如何使用析构函数?
  29. Swift中的类型别名(Type Alias)是什么?如何使用类型别名?
  30. 什么是Swift中的字符串插值(String Interpolation)?如何使用它?
  31. Swift中的模式匹配(Pattern Matching)是什么?举例说明如何使用模式匹配。
  32. 什么是Swift中的断言(Assertions)?如何使用断言进行调试和错误处理?
  33. Swift中的字符串处理方法有哪些?举例说明如何使用字符串处理方法。
  34. 什么是Swift中的枚举(Enum)?如何使用关联值和原始值定义枚举类型?
  35. Swift中的错误类型(Error Type)是什么?如何定义自定义错误类型?
  36. 什么是Swift中的属性包装器(Property Wrapper)?如何使用属性包装器简化属性的定义?
  37. Swift中的元组(Tuple)是什么?举例说明如何使用元组。
  38. 什么是Swift中的值捕获(Value Capture)?如何避免循环引用?
  39. Swift中的条件编译指令(Conditional Compilation Directive)是什么?举例说明如何使用条件编译指令。
  40. 什么是Swift中的模块(Module)?如何使用import关键字导入模块?
  41. Swift中的枚举关联值(Enum Associated Values)是什么?如何使用它们?
  42. 什么是Swift中的属性观察器(Property Observers)?如何使用它们?
  43. Swift中的可变参数(Variadic Parameters)是什么?如何定义和使用可变参数函数?
  44. 什么是Swift中的命名空间(Namespace)?如何使用命名空间解决命名冲突?
  45. Swift中的协议扩展(Protocol Extensions)是什么?举例说明如何使用协议扩展。
  46. 什么是Swift中的模式(Pattern)?举例说明如何使用模式匹配。
  47. Swift中的循环引用(Retain Cycle)是什么?如何避免循环引用?
  48. 什么是Swift中的函数柯里化(Currying)?举例说明如何使用函数柯里化。
  49. Swift中的可变性修饰词(Mutability Modifiers)是什么?请解释let和var的区别。
  50. 什么是Swift中的静态属性和方法(Static Properties and Methods)?如何使用它们?
  51. Swift中的条件语句(Conditional Statements)有哪些?请解释每个条件语句的用途。
  52. 什么是Swift中的异常处理(Exception Handling)?举例说明如何抛出和捕获异常。
  53. Swift中的错误处理(Error Handling)有哪些方式?请解释它们的区别。
  54. 什么是Swift中的递归函数(Recursive Function)?请解释递归函数的概念和用途。
  55. Swift中的属性(Properties)有哪些类型?请解释计算属性和存储属性的区别
本文由作者按照 CC BY 4.0 进行授权