iOS面试题Swift部分

Swift基础面试题

1、Class和Struct 的区别

类是引用类型,结构体是值类型。
结构体不可以继承
值类型被赋予给一个变量、常量或者被传递给一个函数时。其值会倍拷贝。
引用类型在被赋予到一个变量、常量或者被传递到一个函数时、其值不会被拷贝。

2、defer的用法。

使用defer代码块来表示在函数返回前,函数中最后执行的代码。无论函数是否会抛出异常,这段代码都会被执行。

defer语句块中的代码,会在当前作用域结束前掉用。每当一个作用域结束就进行该作用域defer执行。

3、什么是高阶函数。

一个函数如果可以一某一个个函数作为参数,或者是返回值。那么这个函数就称之为高阶函数。

4、什么是copy on write时候

写时复制,指的是swift中的值类型,并不会一开始赋值的时候就去复制,只有再需要修改的时候,才去复制。

5、String 与 NSString 的关系与区别

String 是结构体,值类型,NSStirng 是类,引用类型
NSString 与 String之间可以随意转换

6、associatedtype 的作用

简单来说就是protocol 使用的泛型

实现协议的时候,可以使用typealias 指定特定的类型,也可以自动推断

7、final关键字

final用于限制继承和重写,如果只是需要在某一个属性前加一个final。如果需要限制整个类无法被继承,那么可用用类名之前加一个final

8、public 和 open 的区别

这两个都用于模块声明需要对外界暴露的函数,区别在于,public 修饰的类,在模块外无法被继承,而open则可以任意继承,公开度来说,open>public

9、定义静态方法时关键字 static 和 class 有什么区别

static 定义的方法不可以被子类继承,class则可以

10、throws 和 rethrows 的用法与作用

throws 用在函数上,表示这个函数会抛出异常

rethrows 与 throws 类似,不过只适用于参数中有函数,且函数会抛出异常的情况下,rethrows 可以用throws替换,反过来不行.如

11、mutating关键字

结构体和枚举类型中修改 self 或其属性的方法必须将该实例方法标注为 mutating,否则无法在方法里改变自己的变量。

实现协议中的 mutating 方法时,若是类类型,则不用写 mutating 关键字。而对于结构体和枚举,则必须写 mutating 关键字。

12、必包是引用类型吗

必包是引用类型。如果一个必包被分配给一个变量。这个变量复制给另一个变量,那么他们引用的是同一个必包,他们的捕捉列表也会被复制。

0%