swift 知识点-day2

62 阅读2分钟

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

  1. 使用defer代码块来表示在函数返回前,函数中最后执行的代码。无论函数是否会抛出错误,这段代码都将执行。
  2. 如果一个函数内有多个 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 的区别

  1. 使用范围不同。static 可以在类、结构体、枚举中使用,class 只能在类中使用
  2. static 可以修饰存储属性(称为静态变量),class 则不行
  3. static 修饰的属性和方法不能被重写,class 修饰的则可以