Swift笔试问题与解答

初级

问题1:把下面的for循环改为range形式

回答:

下面的两个range操作等同,


问题2:考虑如下代码

tutorial1.difficulty 和 tutorial2.difficulty的值分别是多少?如果Tutorial是一个class,结果有什么不同,为什么?

回答:tutorial1.difficulty 是 1,tutorial2.difficulty2。
结构体在Swift中是值类型,它直接拷贝值而不是引用。下面一行代码copy一个tutorial1并赋值给tutorial2,对tutorial2的操作不会影响tutorial1:

如果Tutorial是一个class, tutorial1.difficulty 和 tutorial2.difficulty都是2,因为Swift的class是引用类型,对tutorial2的操作同样影响tutorial1。


问题3:view1用var声明,view2用let声明,他们之间的区别:

回答:view1是一个变量可以再次赋值为新的UIView实例,view2只能赋值一次,所以下面代码是错的:


问题4:下面这段代码对数组进行排序而且看上去很复杂。尽可能的对下面代码进行简化:

回答:第一步简化参数。类型推断系统可以自动检测参数类型:

返回值类型可以推断:

$i符号可以替换参数名称:

单条语句里的return可以省略:

现在已经精简的差不多了,其实还可以精简。

对string,有比较函数:

这个函数可以让代码更简单:

上面所有不同的表达,都输出相同的结果。


问题5:下面代码包含2个class,AddressPerson。用它创建两个实例Ray和Brian:

假设Brian搬到了街对面,用下面代码更新记录:

这样做有没有错,错在哪?

回答:Ray也搬到了街对面,class具有引用语义。headquarters是同一个实例,改变headquarters,两个都改。
应该把Address类型改为struct,或为Ray实例一个Address。


中级

问题1:考虑如下代码:

nil.None区别, optional1optional2哪里不同?

回答:都一样,没有什么实质的不同:

Remember that under the hood an optional is an enumeration:


问题2:下面是温度计的class和struct模型:

上面代码编译错误,哪里,为什么?

回答:编译器会抱怨最后一行代码。ThermometerStruct的声明是正确的,编译器报错是因为实例化时用的let,不能在外部对mutating函数进行调用,但是可以在内部调用。


问题3:下面代码输出什么,为什么?

回答:输出:I love cars。当声明closure时已经拷贝了一个thing,所以在更改thing时,没有影响。如果不想拷贝使用如下代码:


问题4:下面的全局函数计算一个数组中不重复值的个数:

调用函数如下:

重写函数,使它成为array的扩展函数,使用如下:

回答:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注