swift 面试(学习路线)
1. 前言
说到 Swift 不得不提一下 Objective-C。
Objective-C 作为和 C++ 同一时代的语言,是苹果和 Smalltalk 生下的孩子,它寄托了苹果无尽的期望。
然而时代在发展,人们通过无数次实践总结出了各种编程思想。Objective-C 那诡异的中括号和动态语言的弊端,让苹果背了越来越多的技术债。大号炼废了就开个小号。
于是苹果总结了现代各种语言的特性,各种编程思想,各种基因掺杂培育出了 Swift。同样 Swift 寄托了苹果无尽的期望,与此同时承诺依旧不会抛弃 Objective-C 这个孩子。(当然现实就是这么残忍,Objective-C 被抛弃的命运是注定的,哪怕依旧有很多它的粉丝,但是一旦亲爹都不想养了,光靠粉丝接济是没用的)
由于 Swift 身上有很多其他语言的基因,以至于很多吃瓜群众对 Swift 有很深的误解,有的人认为它是一门脚本语言,有的人认为它是 OC 的一个语法糖,有的人认为它的速度很慢。
实际上和 JS 这种十几天就诞生出来的语言不同。Swift 包含了很多细节性的设计,每一个语法都是经过不断地推敲和演练的。经历过 Swift 演变升级到现在的稳定 Swift5 的人应该都懂。
这两天静极思动,面了几家试,发现招聘软件上已经开始有专门招 Swift 程序员的公司。
不过发现很多面试官问的最最最的问题就是 类和结构体的区别是什么。。。还有什么是面向协议。然后就没了。。。
2. Swift 相关面试问题
仔细想了想要想区分 Swift 程序员的能力,光靠这两个问题是绝对不行的。有很多问题可以问(下面问题深度顺序比较乱,难度不是依次递增的):
2.1 类和结构体的区别是什么
这个问题很多面试官问的时候更多时候想要得到的答案是:
类和结构体的创建方式一个在堆一个在栈
或者 类是引用类型,结构体是值类型,这种只要是 Swifter 都懂得答案。
但是其实也可以深入的问一下,比如类和结构体的编译方式区分,分类和类的编译方式区分,Swift 为什么要在有类的同时又设计了结构体和枚举。等等
2.2 写时拷贝机制
Swift 本身是很建议程序员少用类,多用结构体、枚举。但是使用结构体的时候,写时拷贝如果不清楚的话,很容易写出性能不是很好的代码。如果是对算法要求高的公司写时拷贝机制是必问的。
2.3 模式匹配
其他语言使用 Switch 语法或多或少都有这样那样的限制,Swift 的 Switch 就不一样,除了对枚举、数字、字符串 Switch,还可以对任意的实现了~= 运算符的对象 Switch。还支持 where 子句、匹配范围、类型推断转换...等等。如此强大的 Switch,面试不深入问一下岂不是可惜。
2.4 协议
Swift 的一大亮点就是面向协议开发,程序员可以对协议扩展默认实现。不但能实现其他语言的类似多继承的效果、而且面向协议开发能对代码带来极大的扩展性。
2.5 泛型
Swift 的泛型感觉真的是做到了极致了,Swift 标准库里面用到了大量的协议和泛型。
如果想招个有点水平的 Swift 开发,泛型岂能不问。
泛型除了问 where 泛型约束这些,也可以问下为什么 Swift 标准库比如 swap、map这些函数为什么要用到泛型,只用协议有什么弊端。
@_specialize也可以问下。
2.6 运算符、下标、字面量协议、尾随闭包
这几个特性可以让 Swift 实现很多语法级别的扩展、也可以问下。
2.7 Optional、变量常量、类型检查、扩展
现代语言设计有很多必选项。Kotlin 和 Swift 有很多相似之处,各有所长。但是他们不约而同的设计了类似于 Optional 这些特性,主要还是因为这些特性都是太多人踩过坑,踩出来的经验。旧时代语言大体定型,不好大改,新时代语言设计之初肯定会考虑这些特性。
2.8 函数式编程
什么函子、单子 使劲问、函数是第一公民之类的也都是必问的。
2.9 响应式编程
可以问问 RxSwift、也可以问问苹果新出的 Combine,思想都一样。比如响应式编程在网络请求,数据解析,UI响应 等等各个方面的表现。
2.10 单向数据流模式
结合 Redux 问问单项数据流的一些流程原理。(Swift版的有个 ReSwift 或者 RxFeedback 等等)。
2.11 MVC、MVVM、Coordinator、单向数据流
这些模式用法千人千面,没有标准答案,都可以深入探讨
2.12 SwiftUI
苹果新出的UI库,结合 Flutter,讨论两者之间各自的好处
2.13 Swift5.1新特性
比如 @propertyWrapper、@_functionBuilder、@dynamicMemberLookup 每一个都值得探讨
2.14 Swift在其他领域的扩展
比如探讨下 Swift 在 Web、后端开发上面的思路、探讨下Swift 在人工智能上面有什么语法的优越性、以及 Swift 在直接使用其他语言所写的库的可行性思路。
3. 结语
大概想了这么十多个问题,还有很多优秀的特性和面试问题,数不胜数。
总体而言,Swift 是一门入门有点小门槛,深入学习有个大门槛的语言,难学难精。很容易区分程序员的水平,两个程度不同的程序员写出的Swift代码 从美观性、性能上面很容易就能看出差距。
但是一旦把 Swift 的设计理念 理清楚,想清楚为什么这样设计,会发现一通百通,Swift 学会,其他语言也就那么回事。