<strike id="6q0um"></strike>
  • <strike id="6q0um"><s id="6q0um"></s></strike>
  • <ul id="6q0um"></ul><strike id="6q0um"></strike>

    當前位置:高考升學網 > 筆試面試 > 正文

    Swift 面試題及其答案

    更新:2023-09-19 07:59:13 高考升學網

    雖然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!

      }

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


    最新圖文

    常見的hr面試官面試問題大全

    時間:2023-09-14 23:0:24

    企業面試官面試的問題有哪些

    時間:2023-09-15 17:0:48

    企業面試官面試問題及參考

    時間:2023-09-17 08:0:27

    高校教師招聘面試答辯100題

    時間:2023-09-17 06:0:03
    亚洲AV日韩AV永久无码绿巨人 | 亚洲自偷自偷图片| 亚洲七久久之综合七久久| 亚洲欧洲日本国产| 久久综合亚洲色一区二区三区| 亚洲av最新在线网址| 亚洲色婷婷六月亚洲婷婷6月| 丝袜熟女国偷自产中文字幕亚洲| 亚洲国产精品一区二区第一页免| 亚洲成av人片不卡无码久久| 亚洲男人的天堂在线va拉文| 亚洲欧洲精品成人久久奇米网| 亚洲日韩在线第一页| 久久久久国产亚洲AV麻豆| 亚洲欭美日韩颜射在线二| 亚洲国产精品高清久久久| 日韩亚洲人成在线综合日本| 久久夜色精品国产嚕嚕亚洲av| 久久精品国产亚洲AV果冻传媒| 亚洲国产精品线在线观看| 久久久久亚洲AV无码永不| 亚洲成aⅴ人片在线观| 亚洲一卡2卡3卡4卡国产网站| 久久亚洲国产成人影院| 亚洲精品无码一区二区| 婷婷综合缴情亚洲狠狠尤物| 亚洲日韩中文字幕日韩在线| 亚洲乱码无码永久不卡在线 | 亚洲香蕉久久一区二区| 亚洲色大成网站www永久网站| 亚洲sm另类一区二区三区| 亚洲av午夜精品一区二区三区| 亚洲人成无码网WWW| 久久久久久久尹人综合网亚洲| 亚洲人成亚洲精品| 亚洲一区中文字幕在线电影网 | 国产V亚洲V天堂A无码| 666精品国产精品亚洲| 中文文字幕文字幕亚洲色| 亚洲s码欧洲m码吹潮| 中文字幕在亚洲第一在线|