1、给⼀个数组,要求⽤swift写⼀个函数,交换数组中的两个元素.
var nums = [1,2,3,4,5,6,7]
func swap(_ nums: inout [T], _ a : Int, _ b : Int){ let count = nums.count if a==b || a<0 || a>count-1 || b<0 || b>count-1 { return } (nums[a],nums[b]) = (nums[b],nums[a])}swap(&nums,1, 3)print(nums)//[1,4,3,2,5,6,7]
2、这段代码有什么问题?
class Node { var value = 0 var prev : Node? var next : Node? init (_ value : Int) { self.value = value }}
主要考察循环引用的问题,如下面代码:
let a = Node(0) let b = Node(1) a.prev = b b.next = a
解决方法,加上weak
weak var prev : Node? weak var next : Node?
3、使用swift实现一个函数,输入是任一整数,输出要返回输入的整数 + 2。
主要考察柯里化
/// 什么是柯里化?// 柯里化指的是从一个多参数函数变成一连串单参数函数的变换func add(input: Int) -> (Int) -> Int { return { value in return input + value }}let addTwo = add(input: 2)let output = addTwo(2) //4let output2 = addTwo(8) //10let addSix = add(input: 6) //可以随便改成+nlet output3 = addSix(2) //8let output4 = addSix(8) //14
4、简化已下的代码
func division(dividend: Double?, by divisor: Double?) -> Double? { if dividend == nil { return nil } if divisor == nil { return nil } if divisor == 0 { return nil } return dividend! / divisor!}
主要考察if let,guard let,可选链式调用
/// if let 和可选链式调用func division1(dividend: Double?, by divisor: Double?) -> Double? { if let dividend = dividend, let divisor = divisor, divisor != 0 { return dividend / divisor } return nil}
/// guard let 和可选链式调用func division2(dividend: Double?, by divisor: Double?) -> Double? { guard let dividend = dividend, let divisor = divisor, divisor != 0 else { return nil } return dividend / divisor}
5、这段代码打印什么
var car = "Benz"let closure = { [car] in print("I drive \(car)")}car = "BMW"closure()
输出:I drive Benz
let closure = { [car] in print("I drive \(car)")}
将声明的参数car,赋值给了局部变量[car] ,与外部变量无关,如果想要打印BMW,需要将[car] in去掉
6、iOS静态库与动态库的区别
- 静态库:链接时会被完整的复制到可执行文件中,被多次 使用就有多份拷贝。
- 动态库:链接时不复制,程序运行时由系统动态加载到内 存,系统只加载一次,多个程序共用,节省内存。
7、内存优化
检测内存问题的一般 方法:
-
- 静态检测方法
-
- 动态检测方法 instruments
-
- dealloc
-
- 第三⽅自动检测库
8、runtime基本用法
-
- ⽤runtime改变变量值
-
- 使用runtime交换方法
-
- 使用runtime添加方法
-
- 使用runtime给分类扩展属性
9、assign 与 weak, 它们都是弱应用声明类型, 最大的区别在哪呢?
- weak 声明的变量对象释放后自动清空, 赋值为nil
assign声明的变量对象释放后不会自动赋值为nil, 会造成野指针错误!
答案都是收集而来,如果有什么错误,欢迎指正!