第一波:
1.jpg
自答:
说实话,刚刚看到这套面试题,我觉得还是很难的,这是要招聘大牛的节奏啊…好吧,菜鸟一枚的我来试着回答一下.
1.什么是函数式编程?
说起链式编程和函数式编程,小伙伴们千万不要紧张。
听着很高大尚,其实也就那么回事。相信有过swift/C#开发经验的,或者其他编程经验的,只要不是OC,一看就知道。 通过一个小例子来解释.
看两行代码:
Person *person = [[Person alloc] init]; person.run(9.2).eat(@"香蕉").run(1.2).eat(@"面条");
上面的就是链式编程+函数式编程.
来个大白话解释:看到括号里面的参数了吧,跟swift的函数调用是不是很相似,包括别的语言,都用小括号传参,只有OC是冒号传参。
再看方法调用用的是”.”,而OC用的是[]+空格。
这几个方法调用,如果要按OC的打法,估计要整4行,对象一个一个的调用方法,但链式就是这么一行搞定.
分析一下,因为Block可以通过()来传值,我们推断run(para)和eat(para)这两个方法,肯定返回值是一个Block,而且是带一个参数的Block
2.什么是ABI?
呜呜
~(>_<)~,这个我真的不知道是什么鬼,不知道和iOS有什么关系,百度也了无法理解….. 希望知道的小伙伴们留言告知.3.什么是MVC,请结合CocoaTouch说明?
M: model V:View C:controller O(∩_∩)O哈哈~ 自行展开,自圆其说吧.
4.什么是MVVM,请设计View moled需要考虑哪些?
M: model V:View VM:ViewModel是View和Model之间的中介
MVVM的出现主要是为了解决在开发过程中Controller越来越庞大的问题,变得难以维护,所以MVVM把数据加工的任务从Controller中解放了出来,使得Controller只需要专注于数据调配的工作,ViewModel则去负责数据加工并通过通知机制让View响应ViewModel的改变。
MVVM是基于胖Model的架构思路建立的,然后在胖Model中拆出两部分:Model和ViewModel。ViewModel本质上算是Model层(因为是胖Model里面分出来的一部分),所以View并不适合直接持有ViewModel,因为ViewModel有可能并不是只服务于特定的一个View,使用更加松散的绑定关系能够降低ViewModel和View之间的耦合度。
其实MVVM是一定需要Controller的参与的,虽然MVVM在一定程度上弱化了Controller的存在感,并且给Controller做了减负瘦身(这也是MVVM的主要目的)。但是,这并不代表MVVM中不需要Controller.严格来说MVVM其实是MVCVM。从中可以得知,Controller夹在View和ViewModel之间做的其中一个主要事情就是将View和ViewModel进行绑定。在逻辑上,Controller知道应当展示哪个View,Controller也知道应当使用哪个ViewModel,然而View和ViewModel它们之间是互相不知道的,所以Controller就负责控制他们的绑定关系,所以叫Controller/控制器就是这个原因。
5.swift相对于OC有哪些优点?
Swift容易阅读
Swift更容易维护
Swift更加安全
Swift代码更少
Swift速度更快
6.什么是泛型,swift在哪些地方使用了泛型?
两个整型数相加和两个浮点数相加的程序看起来应该非常类似,甚至一模一样才对。唯一的区别就是变量的类型不同。
在强类型语言中,你需要去定义诸如addInts, addFloats, addDoubles 等方法来正确地处理参数及返回值.
例如:
func swapTwoValue(a: inout T, b: inout T){ let tempValue = a a = b b = tempValue }
这个函数用 T 占位符来代替实际的类型。并没有指定具体的类型,但是传入的a ,b 必须是同一类型T。在调用这个函数的时候才能指定 T 是那种具体的类型。
7.defer、guard的作用?
defer 译为延缓、推迟之意
比如,读取某目录下的文件内容并处理数据,你需要首先定位到文件目录,打开文件夹,读取文件内容以及处理数据,关闭文件以及文件夹。倘若一切顺利,只需按照设定好的程序流程走一轮即可;不过考虑事情要面面俱到,倘若中间某个环节失败,比如读取文件内容失败、处理数据失败等等,还需要进行一些后续收尾工作,即关闭文件或关闭文件夹(当然就算顺利执行,也是要关闭的)。
func doSomethingWithDefer(){ // 1 openDirectory() // 2 defer{closeDirectory()} // 3 openFile() // 4 defer{closeFile()} // 做其他杂七杂八事情… }
guard 有控制、警戒之意,语法简单,只需两个示例代码即可明白。
// 这里使用if 和 guard进行对比 你会懂的更多
if age < 13 {
return //当年龄小于13时 程序返回 不进行之后的操作
}
用 guard 改写
guard age >= 13 else{
return
}
可以看到代码的意思是保证(guard)age值大于等于13 否则(else)返回,不执行下面程序。
8.swift语法糖?!的本质(实现原理)
相信大家在学习和使用Swift的时候,肯定会被 ! 和 ? 搞疯过, 纠结这两个符号到底是个什么鬼 ?鬼知道什么时候使用!,什么时候使用?
? 和 ! 其实分别是Swift语言中对一种可选类型( Optional) 操作的语法糖。 那可选类型是干什么的呢? Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型生命后加加一个 ? 操作符完成的。
例如: var name: String?
Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None , 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因。
9.举例swift中模式匹配的作用?
Swift有一个很好的特性,那就是模式匹配的扩展。模式是用于匹配的规则值,如switch语句的case,do语句的catch子句,以及if、while、guard、for-in语句的条件。
假设你想判断一个整数是大于、小于还是等于零,你可以用if-else if-else语句,尽管这并不美观:
let x = 10 if x > 0 { print("大于零") } else if x