Swift 面试题及其答案
虽然Swift出生才一年,但是它已经成为最流行的编程语言之一了。它的语法很简单,以至于当它的时候,JavaScript开发者感觉就像下列图一样。
事实上,Swift是一种复杂的语言。它包含面向对象和函数方法这两个方面,并且随着新版本的在一直进化。
你可以用这些问题来测试应聘者关于Swift方面的知识水平,或者测试一下你自己。如果你不知道答案,没关系,没一个问题下面都有答案供你学习。
这些问题包含两个方面:
笔试问题:通过做一个编程测试是极好的,因为这涉及到写大量的代码,从代码质量上可以看出一个人的水平。
问题:面试或者面对面面试也是很好的,因为对面试者来说口头交流会更方面。
每个方面有分成三个等级:
初级:适合读了一到两本有关Swift的书,并且已经开始用Swift开发应用程序的初学者。
中级:适合那些对Swift语言的概念有深刻理解和强烈兴趣的,并且一直在阅读大量有关Swift的博客文章并进展的中级工程师。
高级:适合那些以探索Swift语言知识为乐趣,挑战自己,使用前言技术的人们。
假设你想答复这些问题,我建议你在答复这些问题之前,翻开Playground运行一下这些问题的代码。这些问题的答案都在Xcode 7.0 Beta 6 版本中测试过。
准备好了吗?系好平安带,现在就开始!
笔试问题
初学者
问题1、(Swift 1.0及其之后的版本的问题)有什么更好的方法来写下面的for循环?
for var i = 0; i < 5; i++ {
print("Hello!")
}
答案:
for 4 {
print("Hello!")
}
Swift 实现了两个数组运算符closed operator 和 half-operator.前者包含数组中得所有值。例如:下面的例子包含从0到4得所有整数
0 (4)
half-operator不包含数组中的最后一个元素,下面的例子会得到的结果和上面的一样:
0..<5
问题2– Swift 1.0 or later
思考下面的问题:
struct Tutorial {
var difficulty: Int = 1
}
var tutorial1 = Tutorial()
var tutorial2 = tutorial1
tutorial2.difficulty = 2
tutorial1.difficulty 和 tutorial2.difficulty的值分别是多少?假设Tutorial是一个类,会有什么不同?并说明原因。
答案:tutorial1.difficulty 的值是1,然而
tutorial2.difficulty的值是2.
在Swift中构造体是值类型,他们的值是复制的而不是引用的。下面的一行代码意思是复制了tutorial1的值并把它赋值给tutorial2:
var tutorial2 = tutorial1
从这一行开始,tutorial2值得改变并不影响tutorial1的值。
假设Tutorial是一个类,tutorial1.difficulty和
tutorial2.difficulty的值将都会是2.在Swift中类对象都是引用类型。tutorial1属性的任何改变将会反响到tutorial2上,反之亦然。
问题3 – Swift 1.0 or later
view1声明成var类型,view2声明let类型。这里有什么区别吗?下面的最后一行代码能编译吗?
import UIKit
var view1 = UIView()
view1.alpha = 0.5
let view2 = UIView()
view2.alpha = 0.5 // Will this line pile?
答案:view1是个变量可以重新赋值给一个新的实例化的UIView对象。使用let你只赋值一次,所以下面的代码是不能编译的:学swift语言能干什么
view2 = view1 // Error: view2 is immutable
但是UIView是一个引用类型的类,所以你可以改变view2的属性,也就是说最后一行代码是可以编译的:
let view2 = UIView()
view2.alpha = 0.5 // Yes!
问题4 – Swift 1.0 or later
下面的代码是把数组里面的名字按字母的顺序排序,看上去比拟复杂。尽最大的可能简化闭包里的代码。
let animals = ["fish", "cat", "chicken", "dog"]
let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in
return one < two
}
答案:
第一个简化的是参数。系统的参数类型推断功能,可以计算出闭包里面参数的类型,所以你不必定义参数的类型:
let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two }
函数返回值也可以被推断出来,所以简化掉,代码变为:
let sortedAnimals = animals.sort { (one, two) in return one < two }
这个$i 符号可以代替参数名字,代码进一步简化为:
let sortedAnimals = animals.sort { return $0 < $1 }
在一个独立的闭包内,return这个关键字是可以省略的。最后声明的返回值就是闭包的返回值:
let sortedAnimals = animals.sort { $0 < $1 }
这简化很多了,但是我们不能止步于此!
对于字符串,有一个定义如下的比拟函数:
func Bool
这个简单的小函数可以使你的代码简洁如下:
let sortedAnimals = animals.sort(<)
注意每一步的编译结果都相同,但是最后一步你的闭包里只有一个字符。
问题5 – Swift 1.0 or later
下面的代码创立了两个类Address和Person,并且创立了两个实例对象分别代表Ray和Brain.
class Address {
var fullAddress: String
var city: String
init(fullAddress: String, city: String) {
self.fullAddress = fullAddress
self.city = city
}
}
class Person {
var name: String
var address: Address
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论