- 相關(guān)推薦
Swift筆試試題及其答案
在學(xué)習(xí)、工作中,我們需要用到試題的情況非常的多,借助試題可以更好地考查參試者所掌握的知識(shí)和技能。什么類型的試題才能有效幫助到我們呢?下面是小編收集整理的Swift筆試試題及其答案,僅供參考,大家一起來(lái)看看吧。
Swift筆試試題及其答案 1
問(wèn)題1、(Swift 1.0及其之后的版本的問(wèn)題)有什么更好的方法來(lái)寫(xiě)下面的for循環(huán)?
for var i = 0; i < 5; i++ {
print("Hello!")
}
答案:
for _ in 0...4 {
print("Hello!")
}
Swift 實(shí)現(xiàn)了兩個(gè)數(shù)組運(yùn)算符closed operator 和 half-operator.前者包含數(shù)組中得所有值。例如:下面的例子包含從0到4得所有整數(shù)
0...4
half-operator不包含數(shù)組中的最后一個(gè)元素,下面的例子會(huì)得到的結(jié)果和上面的一樣:
0..<5
問(wèn)題2– Swift 1.0 or later
思考下面的問(wèn)題:
struct Tutorial {
var difficulty: Int = 1
}
var tutorial1 = Tutorial()
var tutorial2 = tutorial1
tutorial2.difficulty = 2
tutorial1.difficulty 和 tutorial2.difficulty的值分別是多少?假如Tutorial是一個(gè)類,會(huì)有什么不同?并說(shuō)明原因。
答案:tutorial1.difficulty 的值是1,然而tutorial2.difficulty的值是2.
在Swift中結(jié)構(gòu)體是值類型,他們的值是復(fù)制的而不是引用的。下面的一行代碼意思是復(fù)制了tutorial1的值并把它賦值給tutorial2:
var tutorial2 = tutorial1
從這一行開(kāi)始,tutorial2值得改變并不影響tutorial1的值。
假如Tutorial是一個(gè)類,tutorial1.difficulty和tutorial2.difficulty的值將都會(huì)是2.在Swift中類對(duì)象都是引用類型。tutorial1屬性的任何改變將會(huì)反應(yīng)到tutorial2上,反之亦然。
問(wèn)題3 – Swift 1.0 or later
view1聲明成var類型,view2聲明let類型。這里有什么區(qū)別嗎?下面的最后一行代碼能編譯嗎?
import UIKit
var view1 = UIView()
view1.alpha = 0.5
let view2 = UIView()
view2.alpha = 0.5 // Will this line compile?
答案:view1是個(gè)變量可以重新賦值給一個(gè)新的實(shí)例化的UIView對(duì)象。使用let你只賦值一次,所以下面的代碼是不能編譯的:
view2 = view1 // Error: view2 is immutable
但是UIView是一個(gè)引用類型的類,所以你可以改變view2的屬性,也就是說(shuō)最后一行代碼是可以編譯的:
let view2 = UIView()
view2.alpha = 0.5 // Yes!
問(wèn)題4 – Swift 1.0 or later
下面的.代碼是把數(shù)組里面的名字按字母的順序排序,看上去比較復(fù)雜。盡最大的可能簡(jiǎn)化閉包里的代碼。
let animals = ["fish", "cat", "chicken", "dog"]
let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in
return one < two
}
答案:
第一個(gè)簡(jiǎn)化的是參數(shù)。系統(tǒng)的參數(shù)類型推斷功能,可以計(jì)算出閉包里面參數(shù)的類型,所以你不必定義參數(shù)的類型:
let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two }
函數(shù)返回值也可以被推斷出來(lái),所以簡(jiǎn)化掉,代碼變?yōu)椋?/p>
let sortedAnimals = animals.sort { (one, two) in return one < two }
這個(gè)$i 符號(hào)可以代替參數(shù)名字,代碼進(jìn)一步簡(jiǎn)化為:
let sortedAnimals = animals.sort { return $0 < $1 }
在一個(gè)獨(dú)立的閉包內(nèi),return這個(gè)關(guān)鍵字是可以省略的。最后聲明的返回值就是閉包的返回值:
let sortedAnimals = animals.sort { $0 < $1 }
這簡(jiǎn)化很多了,但是我們不能止步于此!
對(duì)于字符串,有一個(gè)定義如下的比較函數(shù):
func Bool
這個(gè)簡(jiǎn)單的小函數(shù)可以使你的代碼簡(jiǎn)潔如下:
let sortedAnimals = animals.sort(<)
注意每一步的編譯結(jié)果都相同,但是最后一步你的閉包里只有一個(gè)字符。
問(wèn)題5 – Swift 1.0 or later
下面的代碼創(chuàng)建了兩個(gè)類Address和Person,并且創(chuàng)建了兩個(gè)實(shí)例對(duì)象分別代表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
init(name: String, address: Address) {
self.name = name
self.address = address
}
}
var headquarters = Address(fullAddress: "123 Tutorial Street", city: "Appletown")
var ray = Person(name: "Ray", address: headquarters)
var brian = Person(name: "Brian", address: headquarters)
假設(shè)Brain搬家到街對(duì)面的建筑物里,那么你會(huì)這樣更新他的地址:
brian.address.fullAddress = "148 Tutorial Street"
這樣做將會(huì)發(fā)生什么?錯(cuò)誤出在什么地方呢?
答案:Ray同樣會(huì)搬家到新的建筑物里面。Address是一個(gè)引用類型類,所以無(wú)論你是通過(guò)ray或者brain訪問(wèn)headquarters,訪問(wèn)都是同一個(gè)實(shí)例化對(duì)象。headquarters對(duì)象的變化也會(huì)引起ray和brain的變化。你能想象如果Brain收到Ray的郵件或者相反Ray收到Brain的郵件,將會(huì)發(fā)生什么?解決方案是創(chuàng)建一個(gè)新的Address對(duì)象賦值給Brain或者把Address聲明成為結(jié)構(gòu)體而不是一個(gè)類。
中級(jí)
問(wèn)題1– Swift 2.0 or later
思考下面的代碼:
var optional1: String? = nil
var optional2: String? = .None
答案:兩者沒(méi)有什么不同。Optional.None(簡(jiǎn)稱.None)是optional變量值初始化的標(biāo)準(zhǔn)方法,而nil只是.None語(yǔ)法的一種修飾。事實(shí)上下面語(yǔ)句輸出是正確的:
nil == .None // On Swift 1.x this doesnt compile. You need Optional
.None
記住枚舉類型的Optional下的None:
enum Optional{
case None
case Some(T)
}
問(wèn)題2-Swift 1.0 or later
下面是thermometer作為類和結(jié)構(gòu)體的例子:
public class ThermometerClass {
private(set) var temperature: Double = 0.0
public func registerTemperature(temperature: Double) {
self.temperature = temperature
}
}
let thermometerClass = ThermometerClass()
thermometerClass.registerTemperature(56.0)
public struct ThermometerStruct {
private(set) var temperature: Double = 0.0
public mutating func registerTemperature(temperature: Double) {
self.temperature = temperature
}
}
let thermometerStruct = ThermometerStruct()
thermometerStruct.registerTemperature(56.0)
但是這段代碼編譯失敗了,請(qǐng)問(wèn)哪里報(bào)錯(cuò),出錯(cuò)的原因是什么。
建議:在使用Playground之前,認(rèn)真閱讀代碼并思考。
答案:代碼的最后一行不會(huì)被編譯通過(guò)。ThermometerStruct結(jié)構(gòu)體中正確的聲明了一個(gè)mutating屬性函數(shù),它是用來(lái)改變結(jié)構(gòu)體內(nèi)部 temperature屬性的值的,但是編譯器不通過(guò)的原因是,通過(guò)let創(chuàng)建的不可變的registerTemperature結(jié)構(gòu)體調(diào)用了 registerTemperature函數(shù)。
問(wèn)題3– Swift 1.0 or later
下面的代碼輸出是什么?并說(shuō)明理由。
var thing = "cars"
let closure = { [thing] in
print("I love \(thing)")
}
thing = "airplanes"
closure()
答案:輸出的是:I love cars。當(dāng)閉包被聲明的時(shí)候,抓捕列表就復(fù)制一份thing變量,所以被捕捉的值并沒(méi)有改變,即使你給thing賦了一個(gè)新值。
如果你要忽視閉包中捕捉列表的值,那么編譯器引用那個(gè)值而不是復(fù)制。這種情況下,被引用變量的值的變化將會(huì)反映到閉包中,正如下面的代碼所示:
var thing = "cars"
let closure = {
print("I love \(thing)")
}
thing = "airplanes"
closure() // Prints "I love airplanes"
問(wèn)題4– Swift 2.0 or later
下面是一個(gè)全局函數(shù),這個(gè)函數(shù)的功能是計(jì)算數(shù)組中特殊值得個(gè)數(shù)。(待校驗(yàn))
func countUniques(array: Array) -> Int {
let sorted = array.sort(<)
let initial: (T?, Int) = (.None, 0)
let reduced = sorted.reduce(initial) { ($1, $0.0 == $1 ? $0.1 : $0.1 + 1) }
return reduced.1
}
它使用了< 和==運(yùn)算符,他們限制著T(占位類型)的實(shí)際類型,也就是說(shuō)T必須遵循Comparable協(xié)議。你可以這樣使用它:
countUniques([1, 2, 3, 3]) // result is 3
現(xiàn)在要求你重寫(xiě)上面的方法作為Array的擴(kuò)展方法,然后你就可以這樣寫(xiě)代碼:
[1, 2, 3, 3].countUniques() // should print 3
如何實(shí)現(xiàn)?
答案:在Swift 2.0 中,泛類型可以使用類型約束條件被強(qiáng)制擴(kuò)展。但是假如這個(gè)泛類型不滿足這個(gè)類型的約束條件,那么這個(gè)擴(kuò)展方法既不可見(jiàn)也無(wú)法調(diào)用。
所以countUniques全局函數(shù)可以作為Array的擴(kuò)展方法被重寫(xiě)如下:
extension Array where Element: Comparable {
func countUniques() -> Int {
let sorted = sort(<)
let initial: (Element?, Int) = (.None, 0)
let reduced = sorted.reduce(initial) { ($1, $0.0 == $1 ? $0.1 : $0.1 + 1) }
return reduced.1
}
}
注意:只有元類型實(shí)現(xiàn)了Comparable協(xié)議新的方法才可以被使用。例如,如果你在全部是UIView對(duì)象的數(shù)組中調(diào)用countUniques,編譯器將會(huì)報(bào)錯(cuò)。
import UIKit
let a = [UIView(), UIView()]
a.countUniques() // compiler error here because UIView doesnt implement Comparable
問(wèn)題5- Swift 2.0 or later
下面一個(gè)函數(shù)的功能是計(jì)算兩個(gè)double(optional)類型的數(shù)的相除的結(jié)果。在執(zhí)行除法之前,必須提前滿足三個(gè)條件:
被除數(shù)必須包含nil值
除數(shù)必須為包含nil值
除數(shù)不能為零
func pide(pidend: Double?, by pisor: Double?) -> Double? {
if pidend == .None {
return .None
}
if pisor == .None {
return .None
}
if pisor == 0 {
return .None
}
return pidend! / pisor!
}
Swift筆試試題及其答案 2
1、Swift和Objective-C有什么區(qū)別?
1)Swift是強(qiáng)類型(靜態(tài))語(yǔ)言,有類型推斷,Objective-C弱類型(動(dòng)態(tài))語(yǔ)言
2)Swift面向協(xié)議編程,Objective-C面向?qū)ο缶幊?/p>
3)Swift注重值類型,Objective-C注重引用類型
4)Swift支持泛型,Objective-C只支持輕量泛型(給集合添加泛型)
5)Swift支持靜態(tài)派發(fā)(效率高)、動(dòng)態(tài)派發(fā)(函數(shù)表派發(fā)、消息派發(fā))方式,Objective-C支持動(dòng)態(tài)派發(fā)(消息派發(fā))方式
6)Swift支持函數(shù)式編程(高階函數(shù))
7)Swift的.協(xié)議不僅可以被類實(shí)現(xiàn),也可以被Struct和Enum實(shí)現(xiàn)
8)Swift有元組類型、支持運(yùn)算符重載
9)Swift支持命名空間
10)Swift支持默認(rèn)參數(shù)
11)Swift比Objective-C代碼更簡(jiǎn)潔
2、講講Swift的派發(fā)機(jī)制
1)函數(shù)的派發(fā)機(jī)制:靜態(tài)派發(fā)(直接派發(fā))、函數(shù)表派發(fā)、消息派發(fā)
2)Swift派發(fā)機(jī)制總結(jié):
【Swift筆試試題及其答案】相關(guān)文章:
PHP筆試題及答案02-11
java筆試題及答案08-20
oracle筆試題及答案10-28
華為筆試題及答案11-01
java筆試題及答案02-09
cad筆試試題及答案10-19
高級(jí)網(wǎng)管筆試題及答案02-12
PHP筆試題含答案02-11
外貿(mào)筆試題目及答案10-17