1、给⼀个数组,要求⽤swift写⼀个函数,交换数组中的两个元素.
var nums = [1,2,3,4,5,6,7]
主要考察泛型和元组
func swap<T>(_ 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) //4
let output2 = addTwo(8) //10
let addSix = add(input: 6) //可以随便改成+n
let output3 = addSix(2) //8
let 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、内存优化
检测内存问题的一般 方法:
* 1. 静态检测方法
* 2. 动态检测方法
instruments
* 3. dealloc
* 4. 第三⽅自动检测库
8、runtime基本用法
-
- ⽤runtime改变变量值
-
- 使用runtime交换方法
-
- 使用runtime添加方法
-
- 使用runtime给分类扩展属性
9、assign 与 weak, 它们都是弱应用声明类型, 最大的区别在哪呢?
- weak 声明的变量对象释放后自动清空, 赋值为nil
- assign声明的变量对象释放后不会自动赋值为nil, 会造成野指针错误!
答案都是收集而来,如果有什么错误,欢迎指正!