大风车考试网-在线学习网络资源平台!

所在位置:大風車考試網 > 筆試面試 > 正文

Swift 面試題及其答案

2024-05-23 03:26:35 大風車考試網

雖然Swift出生才一年,但是它已經成為最流行的編程語言之一了。它的語法很簡單,以至于當它發布的時候,java script開發者感覺就像下圖一樣。

事實上,Swift是一種復雜的語言。它包含面向對象和函數方法這兩個方面,并且隨著新版本的發布在一直進化。

你可以用這些問題來測試應聘者關于Swift方面的知識水,或者測試一下你自己。如果你不知道答案,沒關系,沒一個問題下面都有答案供你學習。

這些問題包含兩個方面:

筆試問題:通過電子郵件做一個編程測試是極好的,因為這涉及到寫大量的代碼,從代碼質量上可以看出一個人的水。

面試問題:電話面試或者面對面面試也是很好的,因為對面試者來說口頭交流會更方面。

每個方面有分成三個等級:

初級:適合讀了一到兩本有關Swift的書,并且已經開始用Swift開發應用程序的初學者。

中級:適合那些對Swift語言的概念有深刻理解和強烈興趣的,并且一直在閱讀大量有關Swift的博客文章并進行實踐的中級工程師。

高級:適合那些以探索Swift語言知識為樂趣,挑戰自己,使用前言技術的人們。

假如你想回答這些問題,我建議你在回答這些問題之前,打開Playground運行一下這些問題的代碼。這些問題的答案都在Xcode7.0Beta6版本中測試過。

準備好了嗎?系好安全帶,現在就開始!

筆試問題

初學者

問題1、(Swift1.0及其之后的版本的問題)有什么更好的方法來寫下面的for循環?

forvari=0;i<5;i++{

print("Hello!")

}

答案:

for_in0...4{

print("Hello!")

}

Swift實現了兩個數組運算符closedoperator和half-operator.前者包含數組中得所有值。例如:下面的例子包含從0到4得所有整數

0...4

half-operator不包含數組中的最后一個元素,下面的例子會得到的結果和上面的一樣:

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中結構體是值類型,他們的值是復制的而不是引用的。下面的一行代碼意思是復制了tutorial1的值并把它賦值給tutorial2:

vartutorial2=tutorial1

從這一行開始,tutorial2值得改變并不影響tutorial1的值。

假如Tutorial是一個類,tutorial1.difficulty和tutorial2.difficulty的值將都會是2.在Swift中類對象都是引用類型。tutorial1屬性的任何改變將會反應到tutorial2上,反之亦然。

問題3?Swift1.0orlater

view1聲明成var類型,view2聲明let類型。這里有什么區別嗎?下面的最后一行代碼能編譯嗎?

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

下面的代碼是把數組里面的名字按字母的順序排序,看上去比較復雜。盡最大的可能簡化閉包里的代碼。

letanimals=["fish","cat","chicken","dog"]

letsortedAnimals=animals.sort{(one:String,two:String)->Boolin

returnone<two

}

答案:

第一個簡化的是參數。系統的參數類型推斷功能,可以計算出閉包里面參數的類型,所以你不必定義參數的類型:

letsortedAnimals=animals.sort{(one,two)->Boolinreturnone<two}

函數返回值也可以被推斷出來,所以簡化掉,代碼變為:

letsortedAnimals=animals.sort{(one,two)inreturnone<two}

這個$i符號可以代替參數名字,代碼進一步簡化為:

letsortedAnimals=animals.sort{return$0<$1}

在一個獨立的閉包內,return這個關鍵字是可以省略的。最后聲明的返回值就是閉包的返回值:

letsortedAnimals=animals.sort{$0<$1}

這簡化很多了,但是我們不能止步于此!

對于字符串,有一個定義如下的比較函數:

funcBool

這個簡單的小函數可以使你的代碼簡潔如下:

letsortedAnimals=animals.sort(<)

注意每一步的編譯結果都相同,但是最后一步你的閉包里只有一個字符。

問題5?Swift1.0orlater

下面的代碼創建了兩個類Address和Person,并且創建了兩個實例對象分別代表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)

假設Brain搬家到街對面的建筑物里,那么你會這樣更新他的地址:

brian.address.fullAddress="148TutorialStreet"

這樣做將會發生什么?錯誤出在什么地方呢?

答案:Ray同樣會搬家到新的建筑物里面。Address是一個引用類型類,所以無論你是通過ray或者brain訪問headquarters,訪問都是同一個實例化對象。headquarters對象的變化也會引起ray和brain的變化。你能想象如果Brain收到Ray的郵件或者相反Ray收到Brain的郵件,將會發生什么?解決方案是創建一個新的Address對象賦值給Brain或者把Address聲明成為結構體而不是一個類。

中級

問題1?Swift2.0orlater

思考下面的代碼:

varoptional1:String?=nil

varoptional2:String?=.None

答案:兩者沒有什么不同。Optional.None(簡稱.None)是optional變量值初始化的標準方法,而nil只是.None語法的一種修飾。事實上下面語句輸出是正確的:

nil==.None//OnSwift1.xthisdoesn'tcompile.YouneedOptional

.None

記住枚舉類型的Optional下的None:

enumOptional{

caseNone

caseSome(T)

}

問題2-Swift1.0orlater

下面是thermometer作為類和結構體的例子:

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之前,認真閱讀代碼并思考。

答案:代碼的最后一行不會被編譯通過。ThermometerStruct結構體中正確的聲明了一個mutating屬性函數,它是用來改變結構體內部temperature屬性的值的,但是編譯器不通過的原因是,通過let創建的不可變的registerTemperature結構體調用了registerTemperature函數。

問題3?Swift1.0orlater

下面的代碼輸出是什么?并說明理由。

varthing="cars"

letclosure={[thing]in

print("Ilove\(thing)")

}

thing="airplanes"

closure()

答案:輸出的是:Ilovecars。當閉包被聲明的時候,抓捕列表就復制一份thing變量,所以被捕捉的值并沒有改變,即使你給thing賦了一個新值。

如果你要忽視閉包中捕捉列表的值,那么編譯器引用那個值而不是復制。這種情況下,被引用變量的值的變化將會反映到閉包中,正如下面的代碼所示:

varthing="cars"

letclosure={

print("Ilove\(thing)")

}

thing="airplanes"

closure()//Prints"Iloveairplanes"

問題4?Swift2.0orlater

下面是一個全局函數,這個函數的功能是計算數組中特殊值得個數。(待校驗)

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

}

它使用了<和==運算符,他們限制著T(占位類型)的實際類型,也就是說T必須遵循Comparable協議。你可以這樣使用它:

countUniques([1,2,3,3])//resultis3

現在要求你重寫上面的方法作為Array的擴展方法,然后你就可以這樣寫代碼:

[1,2,3,3].countUniques()//shouldprint3

如何實現?

答案:在Swift2.0中,泛類型可以使用類型約束條件被強制擴展。但是假如這個泛類型不滿足這個類型的約束條件,那么這個擴展方法既不可見也無法調用。

所以countUniques全局函數可以作為Array的擴展方法被重寫如下:

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

}

}

注意:只有元類型實現了Comparable協議新的方法才可以被使用。例如,如果你在全部是UIView對象的數組中調用countUniques,編譯器將會報錯。

importUIKit

leta=[UIView(),UIView()]

a.countUniques()//compilererrorherebecauseUIViewdoesn'timplementComparable

問題5-Swift2.0orlater

下面一個函數的功能是計算兩個double(optional)類型的數的相除的結果。在執行除法之前,必須提前滿足三個條件:

被除數必須包含nil值

除數必須為包含nil值

除數不能為零

funcpide(pidend:Double?,bypisor:Double?)->Double?{

ifpidend==.None{

return.None

}

ifpisor==.None{

return.None

}

ifpisor==0{

return.None

}

returnpidend!/pisor!

}

上面的函數可以正常使用,但是會存在兩個問題:


  • 相關文章
  • 揭秘鮮為人知的高盛面試題揭秘鮮為人知的高盛面試題

    與高盛facetoface?在經歷了四年大學學習、CFA的全級考試、復雜的網申之后,恭喜你到達了面試的環節。對于全球前三的投資銀行,高盛來說。如何才能應對自如的做好面試?.

    2024-06-06 15:01:20
  • HTML前端開發面試題及前端知識HTML前端開發面試題及前端知識

    本文收集并總結了一些優質的前端面試題,初學者看后也要用心鉆研其中的原理,重要知識需要系統學習,透徹學習,形成自己的知識鏈。萬不可投機取巧,只求面試過關是錯..

    2024-05-24 05:26:43
  • 大數據技術Hadoop面試題大數據技術Hadoop面試題

    17.ClouderaCDH是需要付費使用的。()18.Hadoop是Java開發的,所以MapReduce只支持Java語言編寫。()19.Hadoop支持數據的隨機讀寫。()20.NameNode負責管理metadata,cli..

    2024-05-27 01:37:25
  • 揭秘鮮為人知的高盛面試題揭秘鮮為人知的高盛面試題

    與高盛facetoface?在經歷了四年大學學習、CFA的全級考試、復雜的網申之后,恭喜你到達了面試的環節。對于全球前三的投資銀行,高盛來說。如何才能應對自如的做好面試?.

    2024-06-06 15:01:20
  • HTML前端開發面試題及前端知識HTML前端開發面試題及前端知識

    本文收集并總結了一些優質的前端面試題,初學者看后也要用心鉆研其中的原理,重要知識需要系統學習,透徹學習,形成自己的知識鏈。萬不可投機取巧,只求面試過關是錯..

    2024-05-24 05:26:43
  • 大數據技術Hadoop面試題大數據技術Hadoop面試題

    17.ClouderaCDH是需要付費使用的。()18.Hadoop是Java開發的,所以MapReduce只支持Java語言編寫。()19.Hadoop支持數據的隨機讀寫。()20.NameNode負責管理metadata,cli..

    2024-05-27 01:37:25
  • 軍校面試體檢如何輕松過關 軍檢面試內容及技巧軍校面試體檢如何輕松過關 軍檢面試內容及技巧

    軍校面試主要是對報考軍校人員的政治的考核,所以提問的內容大都與政治方向有關,當然了因為面對的是高中學生,一般不會提過難的問題。以下是小編整理的相關內容,供..

    2024-06-22 15:32:36
  • 大學社團宣傳部經典的面試問題大學社團宣傳部經典的面試問題

    1.你對學生會是怎么看的?對于學生會你有什么想法?“學生會是一個集體,我們學生會每一個成員都要時刻維護學生會的優良形象,做好模范帶好頭。要時時以身作則,處處..

    2024-05-26 05:49:51
  • 大學學生會宣傳部的面試問題模板大學學生會宣傳部的面試問題模板

    學生會宣傳部社團面試問題回答11,你認為宣傳部應該是怎樣的一個部門?2,怎樣發揮宣傳部的作用?比如舉辦什么活動。

    2024-06-01 11:04:39
  • 學生會宣傳部面試的簡短問題學生會宣傳部面試的簡短問題

    學生會宣傳部社團面試問題回答11,你認為宣傳部應該是怎樣的一個部門?2,怎樣發揮宣傳部的作用?比如舉辦什么活動。

    2024-05-26 14:04:28
主站蜘蛛池模板: 金酱酒_金酱酒代理加盟招商_OEM贴牌企业定制! – 金酱酒代理加盟!茅台镇较早的酿酒烧坊,年产优质酱香白酒5000余吨,仁怀市十强白酒企业,主营主品:金酱酒、金酱陈香酒、酱香老酒等系列品牌产品 | 膨胀节_波纹膨胀节_非金属膨胀节_波纹管补偿器_膨胀节厂家-江苏苏创管业科技有限公司 | 四川方法数码科技有限公司| 康复器材,康复设备_常州市友邦医疗康复器材有限公司 | 竖豆网-网站建设、小程序商城、软件定制开发 | 涂塑复合钢管,大口径涂塑钢管,内外涂塑钢管厂家-沧州友诚管业有限公司 | 连接器-连接线-连接器厂家-鑫鹏博20年高品质连接器生产厂家 | 医疗器械招标网—打造医械厂家专业服务平台 | 实木中药柜,实木中药斗,木制中药柜,木制中药柜的价格,实木中草药柜,安国美佳中药柜厂家 | 山东德曼医疗设备集团有限公司| 聚四氟乙烯板,聚乙烯四氟板,防火布,廊坊王氏防火材料有限公司官网 | 商标注册查询_商标注册代理公司_专利申请_版权登记-源智知识产权 | 塔罗牌占卜在线预测 - 塔罗牌爱好者 | 厦门,泉州自助餐上门|生日自助餐|婚礼自助餐|公司聚会自助餐|户外烧烤|冷餐|茶歇外卖配送-福建非选餐饮公司 | 盐城市宏展环保材料有限公司-官网-滤袋,过滤袋,液体过滤袋,袋式过滤器,无纺布过滤袋,废液过滤袋 盐城市城镇化建设投资集团有限公司[盐城国资企业、盐城国资集团、盐城文化旅游、盐城基础设施、盐城土地开发、盐城粮食收储] | 医疗器械,理化实验室设备,微生物,培养基,一站式采购 - 杭州润泽仪器商城 | 石墨热场|PECVD石墨舟|碳碳框|燃料电池双极板|半导体石墨|光纤用石墨模具|石墨电极加工|石墨制品|上海弘竣新能源材料有限公司 | 新中式家具,广东新中式家具,广州新中式家具,佛山新中式家具,顺德新中式家具,乐从新中式家具,新中式家具厂家直销--唐明雅居 | 昆明塑料包装袋|云南塑料包装袋|昆明塑料袋厂家|云南茶叶大米蔬菜种子食品包装袋就来阮门包装有限公司 | 全国产品维权打假真伪验证系统-石家庄市海略科技有限公司官方网站 | 江苏上上电缆集团——上上电缆 上上品质| 新洲际教育-一站式留学解决方案领航者【官网】 | 徐州护栏,围栏,锌铁丝网围栏安全设施专家徐州铜山区威峰金属护栏厂 | 浙江世杰阀门有限公司| 郑州同林-金属切削液,全合成,半合成,防锈水溶性,微乳,油基长寿乳化切削液生产厂家 | 陕西|青海|兰州|新疆|西宁|净化工程|西安甘肃|PCR实验室|无尘车间|净化车间-西安环亚净化工程 | 履带吊租赁-履带吊出租-出租履带吊车-出租履带吊-吊车出租-履带吊出租公司 | 虚商通信-电销卡 电销助手| 印刷包装网_印刷包装_机械设备_行业动态_展会信息 | 激光切管机_等离子切管机_相贯线切管机厂家|服务为先-山东美峰智能设备有限公司 | 江西省屹诚建筑装饰工程有限公司 | 山东健泽医疗科技有限公司-官网_深呼吸训练器_肋骨固定板_放疗定位膜耗材生产厂家招商 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 宣城安安橡塑有限责任公司 | 上海鳞片胶泥-环氧胶泥价格-鳞片涂料批发-乙烯基树脂-环氧结构胶-上海富晨 | 找刑事辩护律师_找深圳刑事律师多少钱★王平聚【清华博士/刑法教授】 | 煤泥烘干机,酒糟烘干机,药渣烘干机,酵母烘干机,烘干机厂家-瑞奥新能源 | 吸管包装机_塑料杯包装机_纸杯包装机_吸管挤出机_温州恩博机械有限公司 | 台车炉厂家_台车式退火炉_台车式回火炉—安徽大新工业炉有限公司 | 上海舜华新能源系统有限公司_官网 | 西安宣传片拍摄,陕西艺景网络科技有限公司资料备份,西安影视公司,视频拍摄制作,抖音视频制作,纪录片拍摄西安短视频摄影团队,西安抖音视频拍摄 |