本文提供了10道关于Swift的面试题,并附带了相关答案,主要涵盖了Swift与Objective-C的区别以及Swift的派发机制。
在Swift与Objective-C的区别方面,我们可以看到以下几点:
1. **类型系统**:Swift是强类型语言,具有类型推断功能,而Objective-C是弱类型语言。
2. **编程范式**:Swift支持面向协议编程,而Objective-C主要基于面向对象编程。
3. **数据类型**:Swift强调值类型(如Struct、Enum),Objective-C侧重引用类型(如Class)。
4. **泛型支持**:Swift完全支持泛型,Objective-C仅在集合中提供轻量级泛型支持。
5. **派发机制**:Swift采用静态派发和动态派发,Objective-C主要依赖动态派发(消息传递)。
6. **函数式编程**:Swift支持函数式编程特性,例如高阶函数。
7. **协议实现**:Swift的协议可以被多种类型实现,包括Struct和Enum,Objective-C仅限于Class。
8. **元组与运算符重载**:Swift提供元组类型和运算符重载功能,Objective-C则没有。
9. **命名空间**:Swift支持命名空间,有助于避免名称冲突。
10. **默认参数**:Swift允许函数定义时设置默认参数,Objective-C不具备此特性。
11. **代码简洁性**:Swift的语法通常比Objective-C更为简洁。
接下来讨论Swift的派发机制:
1. **函数派发类型**:包括静态派发(直接派发)、函数表派发和消息派发。
2. **Swift派发机制总结**:
- 值类型(Struct、Enum)使用直接派发。
- 协议扩展使用直接派发。
- Class的初始声明函数使用函数表派发。
- 使用`dynamic`修饰的函数使用消息派发。
- NSObject子类中,未使用`@nonobjc`或`final`修饰的函数,初始声明使用函数表派发,`dynamic`扩展使用消息派发。
3. **查看派发方式**:通过`swiftc -emit-silgen -O example.swift`将Swift代码转换为SIL(中间码)来观察。
4. **指定派发方式**:
- `final`关键字用于强制使用直接派发。
- `static`关键字同样表示直接派发。
- `dynamic`关键字表示使用消息派发。
- `@objc`关键字表明函数遵循Objective-C的消息传递。
- `@inline`关键字告诉编译器可以使用直接派发优化。
最后,我们简要对比了Struct和Class:
1. **继承**:Struct不支持继承,而Class支持。
2. **值类型与引用类型**:Struct是值类型,拷贝时会复制整个实例;Class是引用类型,拷贝时共享同一实例。
3. **常量创建**:Struct用`let`创建的是不可变实例,而Class用`let`创建的是可变实例。
4. **修改属性**:Struct不能直接修改自身属性,需要使用`mutating`关键字修饰的方法。
这些知识点对于理解Swift编程语言的核心特性和在iOS开发中的应用至关重要。熟悉这些概念将有助于提升开发者的技能和面试表现。