當(dāng)前位置:高考升學(xué)網(wǎng) > 筆試面試 > 正文
雖然Swift出生才一年,但是它已經(jīng)成為最流行的編程語言之一了。它的語法很簡單,以至于當(dāng)它發(fā)布的時候,java script開發(fā)者感覺就像下圖一樣。
事實上,Swift是一種復(fù)雜的語言。它包含面向?qū)ο蠛秃瘮?shù)方法這兩個方面,并且隨著新版本的發(fā)布在一直進(jìn)化。
你可以用這些問題來測試應(yīng)聘者關(guān)于Swift方面的知識水平,或者測試一下你自己。如果你不知道答案,沒關(guān)系,沒一個問題下面都有答案供你學(xué)習(xí)。
這些問題包含兩個方面:
筆試問題:通過電子郵件做一個編程測試是極好的,因為這涉及到寫大量的代碼,從代碼質(zhì)量上可以看出一個人的水平。
面試問題:電話面試或者面對面面試也是很好的,因為對面試者來說口頭交流會更方面。
每個方面有分成三個等級:
初級:適合讀了一到兩本有關(guān)Swift的書,并且已經(jīng)開始用Swift開發(fā)應(yīng)用程序的初學(xué)者。
中級:適合那些對Swift語言的概念有深刻理解和強(qiáng)烈興趣的,并且一直在閱讀大量有關(guān)Swift的博客文章并進(jìn)行實踐的中級工程師。
高級:適合那些以探索Swift語言知識為樂趣,挑戰(zhàn)自己,使用前言技術(shù)的人們。
假如你想回答這些問題,我建議你在回答這些問題之前,打開Playground運(yùn)行一下這些問題的代碼。這些問題的答案都在Xcode7.0Beta6版本中測試過。
準(zhǔn)備好了嗎?系好安全帶,現(xiàn)在就開始!
筆試問題
初學(xué)者
問題1、(Swift1.0及其之后的版本的問題)有什么更好的方法來寫下面的for循環(huán)?
forvari=0;i<5;i++{
print("Hello!")
}
答案:
for_in0...4{
print("Hello!")
}
Swift實現(xiàn)了兩個數(shù)組運(yùn)算符closedoperator和half-operator.前者包含數(shù)組中得所有值。例如:下面的例子包含從0到4得所有整數(shù)
0...4
half-operator不包含數(shù)組中的最后一個元素,下面的例子會得到的結(jié)果和上面的一樣:
0..<5
問題2–Swift1.0orlater
思考下面的問題:
structTutorial{
vardifficulty:Int=1
}
vartutorial1=Tutorial()
vartutorial2=tutorial1
tutorial2.difficulty=2
tutorial1.difficulty和tutorial2.difficulty的值分別是多少?假如Tutorial是一個類,會有什么不同?并說明原因。
答案:tutorial1.difficulty的值是1,然而tutorial2.difficulty的值是2.
在Swift中結(jié)構(gòu)體是值類型,他們的值是復(fù)制的而不是引用的。下面的一行代碼意思是復(fù)制了tutorial1的值并把它賦值給tutorial2:
vartutorial2=tutorial1
從這一行開始,tutorial2值得改變并不影響tutorial1的值。
假如Tutorial是一個類,tutorial1.difficulty和tutorial2.difficulty的值將都會是2.在Swift中類對象都是引用類型。tutorial1屬性的任何改變將會反應(yīng)到tutorial2上,反之亦然。
問題3–Swift1.0orlater
view1聲明成var類型,view2聲明let類型。這里有什么區(qū)別嗎?下面的最后一行代碼能編譯嗎?
importUIKit
varview1=UIView()
view1.alpha=0.5
letview2=UIView()
view2.alpha=0.5//Willthislinecompile?
答案:view1是個變量可以重新賦值給一個新的實例化的UIView對象。使用let你只賦值一次,所以下面的代碼是不能編譯的:
view2=view1//Error:view2isimmutable
但是UIView是一個引用類型的類,所以你可以改變view2的屬性,也就是說最后一行代碼是可以編譯的:
letview2=UIView()
view2.alpha=0.5//Yes!
問題4–Swift1.0orlater
下面的代碼是把數(shù)組里面的名字按字母的順序排序,看上去比較復(fù)雜。盡最大的可能簡化閉包里的代碼。
letanimals=["fish","cat","chicken","dog"]
letsortedAnimals=animals.sort{(one:String,two:String)->Boolin
returnone<two
}
答案:
第一個簡化的是參數(shù)。系統(tǒng)的參數(shù)類型推斷功能,可以計算出閉包里面參數(shù)的類型,所以你不必定義參數(shù)的類型:
letsortedAnimals=animals.sort{(one,two)->Boolinreturnone<two}
函數(shù)返回值也可以被推斷出來,所以簡化掉,代碼變?yōu)椋?/p>
letsortedAnimals=animals.sort{(one,two)inreturnone<two}
這個$i符號可以代替參數(shù)名字,代碼進(jìn)一步簡化為:
letsortedAnimals=animals.sort{return$0<$1}
在一個獨立的閉包內(nèi),return這個關(guān)鍵字是可以省略的。最后聲明的返回值就是閉包的返回值:
letsortedAnimals=animals.sort{$0<$1}
這簡化很多了,但是我們不能止步于此!
對于字符串,有一個定義如下的比較函數(shù):
funcBool
這個簡單的小函數(shù)可以使你的代碼簡潔如下:
letsortedAnimals=animals.sort(<)
注意每一步的編譯結(jié)果都相同,但是最后一步你的閉包里只有一個字符。
問題5–Swift1.0orlater
下面的代碼創(chuàng)建了兩個類Address和Person,并且創(chuàng)建了兩個實例對象分別代表Ray和Brain.
classAddress{
varfullAddress:String
varcity:String
init(fullAddress:String,city:String){
self.fullAddress=fullAddress
self.city=city
}
}
classPerson{
varname:String
varaddress:Address
init(name:String,address:Address){
self.name=name
self.address=address
}
}
varheadquarters=Address(fullAddress:"123TutorialStreet",city:"Appletown")
varray=Person(name:"Ray",address:headquarters)
varbrian=Person(name:"Brian",address:headquarters)
假設(shè)Brain搬家到街對面的建筑物里,那么你會這樣更新他的地址:
brian.address.fullAddress="148TutorialStreet"
這樣做將會發(fā)生什么?錯誤出在什么地方呢?
答案:Ray同樣會搬家到新的建筑物里面。Address是一個引用類型類,所以無論你是通過ray或者brain訪問headquarters,訪問都是同一個實例化對象。headquarters對象的變化也會引起ray和brain的變化。你能想象如果Brain收到Ray的郵件或者相反Ray收到Brain的郵件,將會發(fā)生什么?解決方案是創(chuàng)建一個新的Address對象賦值給Brain或者把Address聲明成為結(jié)構(gòu)體而不是一個類。
中級
問題1–Swift2.0orlater
思考下面的代碼:
varoptional1:String?=nil
varoptional2:String?=.None
答案:兩者沒有什么不同。Optional.None(簡稱.None)是optional變量值初始化的標(biāo)準(zhǔn)方法,而nil只是.None語法的一種修飾。事實上下面語句輸出是正確的:
nil==.None//OnSwift1.xthisdoesn'tcompile.YouneedOptional
.None
記住枚舉類型的Optional下的None:
enumOptional{
caseNone
caseSome(T)
}
問題2-Swift1.0orlater
下面是thermometer作為類和結(jié)構(gòu)體的例子:
publicclassThermometerClass{
private(set)vartemperature:Double=0.0
publicfuncregisterTemperature(temperature:Double){
self.temperature=temperature
}
}
letthermometerClass=ThermometerClass()
thermometerClass.registerTemperature(56.0)
publicstructThermometerStruct{
private(set)vartemperature:Double=0.0
publicmutatingfuncregisterTemperature(temperature:Double){
self.temperature=temperature
}
}
letthermometerStruct=ThermometerStruct()
thermometerStruct.registerTemperature(56.0)
但是這段代碼編譯失敗了,請問哪里報錯,出錯的原因是什么。
建議:在使用Playground之前,認(rèn)真閱讀代碼并思考。
答案:代碼的最后一行不會被編譯通過。ThermometerStruct結(jié)構(gòu)體中正確的聲明了一個mutating屬性函數(shù),它是用來改變結(jié)構(gòu)體內(nèi)部temperature屬性的值的,但是編譯器不通過的原因是,通過let創(chuàng)建的不可變的registerTemperature結(jié)構(gòu)體調(diào)用了registerTemperature函數(shù)。
問題3–Swift1.0orlater
下面的代碼輸出是什么?并說明理由。
varthing="cars"
letclosure={[thing]in
print("Ilove\(thing)")
}
thing="airplanes"
closure()
答案:輸出的是:Ilovecars。當(dāng)閉包被聲明的時候,抓捕列表就復(fù)制一份thing變量,所以被捕捉的值并沒有改變,即使你給thing賦了一個新值。
如果你要忽視閉包中捕捉列表的值,那么編譯器引用那個值而不是復(fù)制。這種情況下,被引用變量的值的變化將會反映到閉包中,正如下面的代碼所示:
varthing="cars"
letclosure={
print("Ilove\(thing)")
}
thing="airplanes"
closure()//Prints"Iloveairplanes"
問題4–Swift2.0orlater
下面是一個全局函數(shù),這個函數(shù)的功能是計算數(shù)組中特殊值得個數(shù)。(待校驗)
funccountUniques(array:Array)->Int{
letsorted=array.sort(<)
letinitial:(T?,Int)=(.None,0)
letreduced=sorted.reduce(initial){($1,$0.0==$1?$0.1:$0.1+1)}
returnreduced.1
}
它使用了<和==運(yùn)算符,他們限制著T(占位類型)的實際類型,也就是說T必須遵循Comparable協(xié)議。你可以這樣使用它:
countUniques([1,2,3,3])//resultis3
現(xiàn)在要求你重寫上面的方法作為Array的擴(kuò)展方法,然后你就可以這樣寫代碼:
[1,2,3,3].countUniques()//shouldprint3
如何實現(xiàn)?
答案:在Swift2.0中,泛類型可以使用類型約束條件被強(qiáng)制擴(kuò)展。但是假如這個泛類型不滿足這個類型的約束條件,那么這個擴(kuò)展方法既不可見也無法調(diào)用。
所以countUniques全局函數(shù)可以作為Array的擴(kuò)展方法被重寫如下:
extensionArraywhereElement:Comparable{
funccountUniques()->Int{
letsorted=sort(<)
letinitial:(Element?,Int)=(.None,0)
letreduced=sorted.reduce(initial){($1,$0.0==$1?$0.1:$0.1+1)}
returnreduced.1
}
}
注意:只有元類型實現(xiàn)了Comparable協(xié)議新的方法才可以被使用。例如,如果你在全部是UIView對象的數(shù)組中調(diào)用countUniques,編譯器將會報錯。
importUIKit
leta=[UIView(),UIView()]
a.countUniques()//compilererrorherebecauseUIViewdoesn'timplementComparable
問題5-Swift2.0orlater
下面一個函數(shù)的功能是計算兩個double(optional)類型的數(shù)的相除的結(jié)果。在執(zhí)行除法之前,必須提前滿足三個條件:
被除數(shù)必須包含nil值
除數(shù)必須為包含nil值
除數(shù)不能為零
funcpide(pidend:Double?,bypisor:Double?)->Double?{
ifpidend==.None{
return.None
}
ifpisor==.None{
return.None
}
ifpisor==0{
return.None
}
returnpidend!/pisor!
}
上面的函數(shù)可以正常使用,但是會存在兩個問題:
常見的hr面試官面試問題大全
時間:2023-09-14 23:0:24企業(yè)面試官面試的問題有哪些
時間:2023-09-15 17:0:48企業(yè)面試官面試問題及參考
時間:2023-09-17 08:0:27高校教師招聘面試答辯100題
時間:2023-09-17 06:0:03