阅读 6817

如何面试一个Swift程序员

前言

说到Swift不得不提一下Objective-C。

Objective-C作为和C++同一时代的语言,是苹果和Smalltalk生下的孩子,它寄托了苹果无尽的期望。

然而时代在发展,人们通过无数次实践总结出了各种编程思想。Objective-C那诡异的中括号和动态语言的弊端,让苹果背了越来越多的技术债。 大号炼废了就开个小号。

于是苹果总结了现代各种语言的特性,各种编程思想,各种基因掺杂培育出了Swift。同样Swift寄托了苹果无尽的期望,与此同时承诺依旧不会抛弃Objective-C这个孩子。(当然现实就是这么残忍,Objective-C被抛弃的命运是注定的,哪怕依旧有很多它的粉丝,但是一旦亲爹都不想养了,光靠粉丝接济是没用的)

由于Swift身上有很多其他语言的基因,以至于很多吃瓜群众对Swift有很深的误解,有的人认为它是一门脚本语言,有的人认为它是OC的一个语法糖,有的人认为它的速度很慢。

实际上和JS这种十几天就诞生出来的语言不同。Swift包含了很多细节性的设计,每一个语法都是经过不断地推敲和演练的。经历过Swift演变升级到现在的稳定Swift5的人应该都懂。

这两天静极思动,面了几家试,发现招聘软件上已经开始有专门招Swift程序员的公司。

不过发现很多面试官问的最最最的问题就是 类和结构体的区别是什么。。。 还有什么是面向协议。然后就没了。。。

仔细想了想要想区分Swift程序员的能力,光靠这两个问题是绝对不行的。有很多问题可以问(下面问题深度顺序比较乱,难度不是依次递增的):

1.类和结构体的区别是什么

这个问题很多面试官问的时候更多时候想要得到的答案是

类和结构体的 创建方式一个在堆一个在栈(结构体一般会被优化存储到栈上,但不是绝对的),或者类是引用类型 结构体是值类型 这种只要是Swifter都懂得答案。(个人测试过结构体和类的创建速度,因为结构体创建一般不涉及到堆内存分配,创建速度比类快了10w倍不止,早期的swift版本效果可能没这么大,10w这个数字也是不准的,但的确快了好几个量级。当然类创建速度也不慢,只不过是相对而言)

但是其实也可以深入的问一下,比如类和结构体的 编译方式区分,分类和类的编译方式区分,Swift为什么要在有类的同时又设计了结构体和枚举。等等

2.写时拷贝机制

Swift本身是很建议程序员少用类 多用结构体 枚举。但是使用结构体的时候,写时拷贝如果不清楚的话,很容易写出性能不是很好的代码。如果是对算法要求高的公司写时拷贝机制是必问的。

3.模式匹配

其他语言使用Switch语法或多或少 都有这样那样的限制,Swift的Switch就不一样,除了对枚举 数字 字符串 Switch,还可以对任意的实现了~=运算符的对象 Switch。还支持where子句、匹配范围、类型推断转换。。。等等。如此强大的Switch,面试不深入问一下岂不是可惜。

4.协议

Swift的一大亮点就是面向协议开发,程序员可以 对协议扩展默认实现。不但能实现其他语言的类似多继承的效果、而且面向协议开发能对代码带来极大的扩展性。

5.泛型

Swift的泛型感觉真的是做到了极致了,Swift标准库里面用到了大量的协议和泛型。

如果想招个有点水平的Swift开发、泛型岂能不问。

泛型除了问 where泛型约束 这些,也可以问下为什么Swift标准库比如 swap map这些函数为什么要用到泛型,只用协议有什么弊端。

@_specialize也可以问下

6.运算符、下标、字面量协议、尾随闭包

这几个特性可以让Swift实现很多语法级别的扩展、也可以问下。

7.Optional、变量常量、类型检查、扩展

现代语言设计有很多必选项。Kotlin和Swift有很多相似之处,各有所长。 但是他们不约而同的设计了类似于Optional这些特性,主要还是因为这些特性都是太多人踩过坑,踩出来的经验。旧时代语言大体定型,不好大改,新时代语言设计之初肯定会考虑这些特性。

8.函数式编程

什么函子、单子 使劲问、函数是第一公民之类的也都是必问的。

9.响应式编程

可以问问RxSwift、也可以问问苹果新出的Combine,思想都一样。 比如响应式编程在网络请求,数据解析,UI响应 等等各个方面的表现

10.单向数据流模式

结合Redux问问单项数据流的一些流程原理。(Swift版的有个ReSwift或者RxFeedback等等)

11.MVC、MVVM、Coordinator、单向数据流

这些模式用法千人千面,没有标准答案,都可以深入探讨

12.SwiftUI

苹果新出的UI库,结合Flutter,讨论两者之间各自的好处

13.Swift5.1新特性

比如@propertyWrapper、@_functionBuilder、@dynamicMemberLookup每一个都值得探讨

14.Swift在其他领域的扩展

比如探讨下Swift在Web、后端开发上面的思路、探讨下Swift在人工智能上面有什么语法的优越性、以及Swift在直接使用其他语言所写的库的可行性思路。

结语

大概想了这么十多个问题,还有很多优秀的特性和面试问题,数不胜数。

总体而言,Swift是一门入门有点小门槛,深入学习有个大门槛的语言,难学难精。很容易区分程序员的水平,两个程度不同的程序员写出的Swift代码 从美观性、性能上面很容易就能看出差距。

但是一旦把Swift的设计理念 理清楚,想清楚为什么这样设计,会发现一通百通,Swift学会,其他语言也就那么回事。

文章分类
iOS
文章标签