如何面试一个 Swift 程序员


作者丨ZJaDe

来源:

https://juejin.im/post/5d830222e51d453b7403fa49#heading-0

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 标准库比如 swapmap这些函数为什么要用到泛型,只用协议有什么弊端。

@_specialize也可以问下。

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

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

2.7 Optional、变量常量、类型检查、扩展

现代语言设计有很多必选项。KotlinSwift 有很多相似之处,各有所长。但是他们不约而同的设计了类似于 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 学会,其他语言也就那么回事。

近期精彩内容推荐:  

 妹子 rm -rf 把公司整个数据库删没了...

 当互联网码农遇见国企老同学

 推荐33个IDEA最牛配置,写代码太爽了

 Python中zip()函数的解释和可视化

在看点这里好文分享给更多人↓↓

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值