前言
Swift语言至今诞生有一年多的时间了,已经成为当前最流行语言之一。虽然它的语法简单好用,但实际上Swift是一门非常复杂的语言。因为它不仅是面向对象的同时又是函数式编程语言。本文主要介绍Swift常见的一些面试问题,你可以用这些问题向面试者提问,也可以用来测试你自己目前所掌握的Swift知识,如果你不清楚问题答案的话也不用太担心,因为每个问题下面都有相应的答案。
一、给一个数组,要求写一个函数,交换数组中的两个元素
二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])
}
同时对以上代码写上相应测试,检测各种边界情况,再确认无误后,才会说,这道题目我完成了。
这道题目看似简单,实际上考察了程序员的审题、交流、以及测试的意识。技术上考察了Swift的泛型和Tuple的性质。
二、下面代码有什么问题
public class Node {
public var value: Int
public var prev: Node?
public var post: Node?
public init(_ value: Int) {
self.value = value
}
}
答案:应该在 var prev 或者 var post 前面加上 weak。
原因:表面上看,以上代码毫无问题。但是我这样一写,问题就来了:
let head = Node(0)
let tail = Node(1)
head.post = tail
tail.prev = head
此时,head 和 tail 互相指向,形成循环引用(retain cycle)。
三、实现一个函数,输入是任一整数,输出要返回输入的整数 + 2
这道题很多人上来就这样写:
func addTwo(_ num: Int) -> Int {
return num + 2
}
接下来面试官会说,那假如我要实现 + 4 呢?程序员想了一想,又定义了另一个方法:
func addFour(_ num: Int) -> Int {
return num + 4
}
这时面试官会问,假如我要实现返回 + 6, + 8 的操作呢?能不能只定义一次方法呢?正确的写法是利用 Swift 的柯西特性:








