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中的协议:
- 受限于委托代理的含义,多⽤于不同类之间的传值与回调。
Swift的协议:
- 可以通过协议 (extension) 扩展,实现协议的⽅法(OC不⾏)
- 定义属性⽅法
- 通过抽取不同类中的相同⽅法和属性,实现模块化减少耦合。使面向协议编程成为可能
- 不需要单独声明协议对象和指定代理
协议可以继承其他协议
- 什么是Swift编程语言?它有哪些特点和优势?
- Swift中的值类型和引用类型有什么区别?
- 什么是可选类型(Optional)?如何使用它们处理可能为空的值?
- 什么是自动引用计数(ARC)?它是如何管理内存的?
- Swift中的延迟初始化(Lazy Initialization)是什么?如何使用它?
- 什么是Swift中的闭包(Closure)?如何捕获值?
- Swift中的高阶函数(Higher-Order Functions)有哪些?举例说明使用高阶函数的场景。
- Swift中的协议(Protocol)是什么?如何定义和遵循一个协议?
- 什么是Swift中的扩展(Extension)?如何使用扩展添加功能?
- Swift中的委托模式(Delegate Pattern)是什么?如何实现委托?
- 什么是Swift中的泛型(Generics)?如何创建泛型函数和类型?
- Swift中的错误处理机制是什么?举例说明如何抛出和处理错误。
- 什么是Swift中的类型推断(Type Inference)?它是如何工作的?
- Swift中的访问控制有哪些级别?请解释每个级别的作用和使用场景。
- 什么是Swift中的逃逸闭包(Escaping Closure)?为什么需要使用@escaping关键字?
- Swift中的异步编程模型是什么?举例说明如何使用异步和await关键字。
- 什么是Swift中的懒加载(Lazy Loading)?如何使用它延迟加载对象?
- Swift中的协程(Coroutines)是什么?它们有什么优势?
- 什么是Swift中的函数式编程(Functional Programming)?举例说明如何在Swift中使用函数式编程思想。
- Swift中的操作符重载(Operator Overloading)是什么?如何重载操作符?
- 什么是Swift中的访问器(Accessors)?有哪些类型的访问器?
- Swift中的属性观察器(Property Observers)是什么?如何使用它们?
- 什么是Swift中的析构函数(Deinitializer)?如何使用析构函数?
- Swift中的类型别名(Type Alias)是什么?如何使用类型别名?
- 什么是Swift中的字符串插值(String Interpolation)?如何使用它?
- Swift中的模式匹配(Pattern Matching)是什么?举例说明如何使用模式匹配。
- 什么是Swift中的断言(Assertions)?如何使用断言进行调试和错误处理?
- Swift中的字符串处理方法有哪些?举例说明如何使用字符串处理方法。
- 什么是Swift中的枚举(Enum)?如何使用关联值和原始值定义枚举类型?
- Swift中的错误类型(Error Type)是什么?如何定义自定义错误类型?
- 什么是Swift中的属性包装器(Property Wrapper)?如何使用属性包装器简化属性的定义?
- Swift中的元组(Tuple)是什么?举例说明如何使用元组。
- 什么是Swift中的值捕获(Value Capture)?如何避免循环引用?
- Swift中的条件编译指令(Conditional Compilation Directive)是什么?举例说明如何使用条件编译指令。
- 什么是Swift中的模块(Module)?如何使用import关键字导入模块?
- Swift中的枚举关联值(Enum Associated Values)是什么?如何使用它们?
- 什么是Swift中的属性观察器(Property Observers)?如何使用它们?
- Swift中的可变参数(Variadic Parameters)是什么?如何定义和使用可变参数函数?
- 什么是Swift中的命名空间(Namespace)?如何使用命名空间解决命名冲突?
- Swift中的协议扩展(Protocol Extensions)是什么?举例说明如何使用协议扩展。
- 什么是Swift中的模式(Pattern)?举例说明如何使用模式匹配。
- Swift中的循环引用(Retain Cycle)是什么?如何避免循环引用?
- 什么是Swift中的函数柯里化(Currying)?举例说明如何使用函数柯里化。
- Swift中的可变性修饰词(Mutability Modifiers)是什么?请解释let和var的区别。
- 什么是Swift中的静态属性和方法(Static Properties and Methods)?如何使用它们?
- Swift中的条件语句(Conditional Statements)有哪些?请解释每个条件语句的用途。
- 什么是Swift中的异常处理(Exception Handling)?举例说明如何抛出和捕获异常。
- Swift中的错误处理(Error Handling)有哪些方式?请解释它们的区别。
- 什么是Swift中的递归函数(Recursive Function)?请解释递归函数的概念和用途。
- Swift中的属性(Properties)有哪些类型?请解释计算属性和存储属性的区别
本文由作者按照 CC BY 4.0 进行授权