1. swift 的写时复制机制理解
什么是写时复制机制?当某个调用者试图修改资源内容时,系统才会真正复制一份给调用者,而不是在给调用者赋值时就立刻拷贝一份。这种就称为写时复制机制。
var arr1 = [2, 4, 6]
var arr2 = arr1
print(UnsafePointer(&arr1)) // 0x0000600003224b20
print(UnsafePointer(&arr2)) // 0x0000600003224b20
arr2.append(8)
print(UnsafePointer(&arr1)) // 0x0000600003224b20
print(UnsafePointer(&arr2)) // 0x0000600000463f40
只有 Array, Dictionary, Set 采用了 Copy on Write (写时复制)技术。
如何自己实现写时复制?
用 Swift中 的 isKnownUniquelyReferenced 函数来检查引用是否只有一个持有者。
2. 关键字 defer
- 使用defer代码块来表示在函数返回前,函数中最后执行的代码。无论函数是否会抛出错误,这段代码都将执行。
- 如果一个函数内有多个 defer,则执行顺序为从后到前,即最后的 defer 语句最先执行;
3. inout (输入输出参数 )
标记某函数的参数是可以修改的,使用 inout 修饰的函数在进行函数调用时需要把地址传进去。例子
func test(_ num: inout Int) {
num = 30
}
var a = 10
test(&a)
print(a) // 输出:30
4. 什么是高阶函数
高阶函数也是一个函数,该函数可以接收函数作为参数, 或者返回一个函数来操作其它函数。 代表:map, flatMap, contactMap, filter, reduce
5. static 和 class 的区别
- 使用范围不同。static 可以在类、结构体、枚举中使用,class 只能在类中使用
- static 可以修饰存储属性(称为静态变量),class 则不行
- static 修饰的属性和方法不能被重写,class 修饰的则可以