iOS面试题(二)

2018-05-29  本文已影响12人  WinJayQ

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、内存优化

检测内存问题的一般 方法:

8、runtime基本用法

9、assign 与 weak, 它们都是弱应用声明类型, 最大的区别在哪呢?

答案都是收集而来,如果有什么错误,欢迎指正!

上一篇 下一篇

猜你喜欢

热点阅读