2018收集iOS笔试题(仅供参考学习使用)

第一波:

image

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 
如果需要以下书籍,请加QQ群687528266免费分享

猜你喜欢

转载自blog.csdn.net/ping20/article/details/81038923
今日推荐