Swift - 基础面试题

面试题目录

  • 一、类和结构体的区别是什么
  • 二、写时拷贝机制
  • 三、模式匹配
  • 四、协议
  • 五、泛型
  • 六、运算符、下标、字面量协议、尾随闭包
  • 七、Optional、变量常量、类型检查、扩展
  • 八、函数式编程
  • 九、响应式编程
  • 十、swift和OC的区别?

一、类和结构体的区别是什么

  1. 类是引用类型,结构体是值类型,拷贝赋值时,结构体是值拷贝,对象赋值时指针拷贝。
  2. 结构体保存在栈区,类对象保存在堆区,类对象指针一般在栈区,指向堆区的对象。
  3. 结构体无析构函数,类有析构函数,在释放时可以调用相应的方法。
  4. 结构体构造函数会自动生成带参数的构造器。类不会对自动生成带参数的构造器。
  5. 结构体没有继承特性,类有继承特性。
  6. 结构体的成员变量不需要初始化,编译器会自动初始化赋值,而类的成员变量必须被初始化。
  7. 结构体不能序列化为NSData,而类可以序列化为NSData。
  8. 混合开发中,OC不能调用swift的struct对象,可以调用swift中的类对象。
  9. 方法派发
    结构体为静态派发,编译器将函数地址直接编码在汇编中,调用的时候根据地址直接跳转到实现,编译器可以进行内联等优化,
    类为动态派发,运行时查找函数表,找到后再跳转到实现。
  10. 结构体在func里面需要修改property的时候需要加上mutating关键字,而class就不用。

开发中类和结构体的选择
1、需要存储的内容占用内存较小的时候,优先考虑使用结构体
2、大内存数据优先考虑使用类
3、不需要进行继承使用且结构体满足要求时优先使用结构体
4、简单的数据存储且满足要求时使用结构体。
5、满足要求时,优先使用结构体,可以减少app的启动时间。
6、需要进行值拷贝而不是指针拷贝时优先使用结构体。

二、写时拷贝机制

Swift的写时拷贝(Copy-on-Write)机制是指在对可变类型进行修改操作之前不会立即创建新的数据副本。而是将原始值与引用计数器关联起来,只有当需要修改该值时才会真正复制并分配内存空间
Swift本身是很建议程序员少用类,多用结构体、枚举。但是使用结构体的时候,写时拷贝如果不清楚的话,很容易写出性能不是很好的代码。如果是对算法要求高的公司写时拷贝机制是必问的。

三、模式匹配

模式是用于匹配的规则,比如switch的case、捕捉错误的catch、if、guard、while、for语句的条件等。

Swift中的模式有:

  • 通配符模式(Wildcard Pattern)
    匹配任何值,使用_表示。_?匹配非nil值。
  • 标识符模式(Identifier Pattern)
    给对应的变量、常量名赋值。例如,var name="rose"
  • 值绑定模式(Value-Binding Pattern)
    将匹配的值绑定到对应的变量上。例如,
let point=(3,2)
switch point{
case let(x,y):
	print("The point is at \(x),\(y)")
}
  • 元组模式(Tuple Pattern)
    通过元组类型来匹配,并将匹配的值绑定到对应的位置。例如,
let points = [(0,0),(0,1),(0,2)]
for (x,_) in points {
	print(x)
}
  • 枚举Case模式(Enumeration Case Pattern)
    用于if case语句,等价于只有一个case的switch语句。例如,
let age=2
if case 0...9 = age {
	print("在范围之间")
}
  • 可选模式(Optional Pattern)
    用于匹配可选类型的值。例如,
let age: [Int?] = [nil,2,3,nil,8]
for case let age? in ages { 
	print(age)
}
  • 类型转换模式(Type-Casting Pattern)
    用于在switch语句中匹配特定类型的值。例如,
let num: Any = 6 
switch num {
case is Int: // 编译器依然认为num是Any类型
	print("is Int",num)//case let n as Int:// print("as Int", n + 1)
default:
	break
}
  • 表达式模式(Expression Pattern)
let point = (1, 2)
switch point {
   case (0, 0):
      print("(0, 0) is at the origin.")
   case (-2...2, -2...2):
      print("(\(point.0), \(point.1)) is near the origin.")
   default:
      print("The point is at (\(point.0), \(point.1)).")
} // (1, 2) is near the origin.

四、协议

Swift的一大亮点就是面向协议开发,程序员可以 对协议扩展默认实现。不但能实现其他语言的类似多继承的效果、而且面向协议开发能对代码带来极大的扩展性。

五、泛型

泛型主要用于解决代码的抽象能力 + 代码的复用性
Swift的泛型感觉真的是做到了极致了,Swift标准库里面用到了大量的协议和泛型。
如果想招个有点水平的Swift开发、泛型岂能不问。

泛型除了问 where泛型约束 这些,也可以问下为什么Swift标准库比如 swap map这些函数为什么要用到泛型,只用协议有什么弊端。

@_specialize也可以问下

六、运算符、下标、字面量协议、尾随闭包

这几个特性可以让Swift实现很多语法级别的扩展。

七、Optional、变量常量、类型检查、扩展

现代语言设计有很多必选项。Kotlin和Swift有很多相似之处,各有所长。
但是他们不约而同的设计了类似于Optional这些特性,主要还是因为这些特性都是太多人踩过坑,踩出来的经验。旧时代语言大体定型,不好大改,新时代语言设计之初肯定会考虑这些特性。

八、函数式编程

什么函子、单子 使劲问、函数是第一公民之类的也都是必问的。

九、响应式编程

可以问问RxSwift、也可以问问苹果新出的Combine,思想都一样。
比如响应式编程在网络请求,数据解析,UI响应 等等各个方面的表现

十、swift和OC的区别?

1)swift是静态语言,有类型推断,OC是动态语言。
2)swift是一门支持多编程范式的语言,既支持面向对象编程,也支持面向协议编程,同时还支持函数式编程,OC面向对象编程。
3)swift注重值类型,OC注重引用类型。
4)swift支持泛型,OC只支持轻量泛型
5)swift支持静态派发(效率高)、动态派发(函数表派发、消息派发)方式,OC支持动态派发(消息派发)方式。
6)swift的协议不仅可以被类实现,也可以被struct和enum实现
7)swift有元组类型、支持运算符重载
8)swift支持命名空间
9)swift支持默认参数
10)swift比oc代码更加简洁

Swift相对OC有什么优势
1)swift容易阅读,语法和文件结构简易化。
2)swift更易于维护,文件分离后结构更清晰。
3)swift更加安全,它是类型安全的语言:
4)swift代码更少,简洁的语法,可以省去大量冗余代码。
5)swift速度更快,运算性能更高。

你可能感兴趣的:(面试题,swift,面试)