# 道长的 Swift 面试题

##### 1. 给一个数组，要求写一个函数，交换数组中的两个元素
• 二X程序员：
好简单啊，直接写出以下结果
``````func swap(_ nums: inout [Int], _ p: Int, _ q: Int) {
let temp = nums[p]
nums[p] = nums[q]
nums[q] = temp
}
``````
• 普通程序员：
首先跟面试官沟通，是什么类型的数组？面试官会说，任意。普通程序员微微一笑，写出以下代码
``````func swap<T>(_ nums: inout [T], _ p: Int, _ q: Int) {
let temp = nums[p]
nums[p] = nums[q]
nums[q] = temp
}
``````
• 文艺程序员：
与面试官沟通，是什么类型的数组？有什么其他要求和限制？面试官会说，这是一个Swift面试题。文艺程序员心领神会，于是写出以下答案
``````func swap<T>(_ nums: inout [T], _ p: Int, _ q: Int) {
(nums[p], nums[q]) = (nums[q], nums[p])
}
``````

##### 2. 实现一个函数，输入是任一整数，输出要返回输入的整数 + 2

``````func addTwo(_ num: Int) -> Int {
return num + 2
}
``````

``````func addFour(_ num: Int) -> Int {
return num + 4
}
``````

``````func add(_ num: Int) -> (Int) -> Int {
return { val in
return num + val
}
}

``````
##### 3. 精简以下代码
``````func divide(dividend: Double?, by divisor: Double?) -> Double? {
if dividend == nil {
return nil
}
if divisor == nil {
return nil
}
if divisor == 0 {
return nil
}
return dividend! / divisor!
}
``````

``````func divide(dividend: Double?, by divisor: Double?) -> Double? {
guard let dividend = dividend, let divisor = divisor, divisor != 0 else {
return nil
}

return dividend / divisor
}
``````
##### 4. 以下函数会打印出什么？
``````var car = "Benz"
let closure = { [car] in
print("I drive \(car)")
}
car = "Tesla"
closure()
``````

``````var car = "Benz"
let closure = {
print("I drive \(car)")
}
car = "Tesla"
closure()
``````

##### 5. 以下代码会打印出什么？
``````protocol Pizzeria {
func makePizza(_ ingredients: [String])
func makeMargherita()
}

extension Pizzeria {
func makeMargherita() {
return makePizza(["tomato", "mozzarella"])
}
}

struct Lombardis: Pizzeria {
func makePizza(_ ingredients: [String]) {
print(ingredients)
}
func makeMargherita() {
return makePizza(["tomato", "basil", "mozzarella"])
}
}

let lombardis1: Pizzeria = Lombardis()
let lombardis2: Lombardis = Lombardis()
lombardis1.makeMargherita()
lombardis2.makeMargherita()
``````

["tomato", "basil", "mozzarella"]
["tomato", "basil", "mozzarella"]

``````protocol Pizzeria {
func makePizza(_ ingredients: [String])
}

extension Pizzeria {
func makeMargherita() {
return makePizza(["tomato", "mozzarella"])
}
}

struct Lombardis: Pizzeria {
func makePizza(_ ingredients: [String]) {
print(ingredients)
}
func makeMargherita() {
return makePizza(["tomato", "basil", "mozzarella"])
}
}

let lombardis1: Pizzeria = Lombardis()
let lombardis2: Lombardis = Lombardis()
lombardis1.makeMargherita()
lombardis2.makeMargherita()
``````

["tomato", "mozzarella"]
["tomato", "basil", "mozzarella"]

##### 6. Swift 中定义常量和 Objective-C 中定义常量有什么区别？

OC是这样定义常量的：

``````const int number = 0;
``````

Swift 是这样定义常量的：

``````let number = 0
``````

<br >

##### 7. Swift 中 struct 和 class 什么区别？举个应用中的实例

struct 是值类型，class 是引用类型。

``````class A {
var val = 1
}

var a = A()
var b = a
b.val = 2
``````

``````struct A {
var val = 1
}

var a = A()
var b = a
b.val = 2
``````

##### 8. Swift 到底是面向对象还是函数式的编程语言？

Swift 既是面向对象的，又是函数式的编程语言。

### 推荐阅读更多精彩内容

• 109.关联值 上部分实例展示枚举分支是一个定义值（类型值）。 你可以把一个常量或者变量设置成 Planet.ea...
无沣阅读 425评论 0 3
• 123.继承 一个类可以从另外一个类继承方法,属性和其他特征。当一个类继承另外一个类时, 继承类叫子类, 被继承的...
无沣阅读 456评论 2 3
• importUIKit classViewController:UITabBarController{ enumD...
明哥_Young阅读 809评论 1 3
• 你总是咀嚼着农事 没日没夜的忙 你对我 总是一副满脸不在乎的样子 你总是把眉头紧锁把关爱隐藏 多少次我也怀疑过你 ...
箬竹_泠萱阅读 55评论 2 5
• 茶余饭后，谈起民国美女会让你想起周璇和阮玲玉；谈起民国才女会让你想起林徽因、苏雪林、张爱玲、蒋碧微、萧红和许广平。...
Cat猫眼阅读 1,016评论 7 19