亚洲福利精品久久久久91|中文字幕乱码视频网|在线播放国产精品一区二区|亚洲成AV人片女在线观看

  • <label id="nsftt"></label>

          <bdo id="nsftt"></bdo>
              <object id="nsftt"><tt id="nsftt"><pre id="nsftt"></pre></tt></object>

              Swift 面試題及其答案

              思而思學(xué)網(wǎng)

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

              事實(shí)上,Swift是一種復(fù)雜的語言。它包含面向?qū)ο蠛秃瘮?shù)方法這兩個(gè)方面,并且隨著新版本的發(fā)布在一直進(jìn)化。

              你可以用這些問題來測試應(yīng)聘者關(guān)于Swift方面的知識(shí)水平,或者測試一下你自己。如果你不知道答案,沒關(guān)系,沒一個(gè)問題下面都有答案供你學(xué)習(xí)。

              這些問題包含兩個(gè)方面:

              筆試問題:通過電子郵件做一個(gè)編程測試是極好的,因?yàn)檫@涉及到寫大量的代碼,從代碼質(zhì)量上可以看出一個(gè)人的水平。

              面試問題:電話面試或者面對(duì)面面試也是很好的,因?yàn)閷?duì)面試者來說口頭交流會(huì)更方面。

              每個(gè)方面有分成三個(gè)等級(jí):

              初級(jí):適合讀了一到兩本有關(guān)Swift的書,并且已經(jīng)開始用Swift開發(fā)應(yīng)用程序的初學(xué)者。

              中級(jí):適合那些對(duì)Swift語言的概念有深刻理解和強(qiáng)烈興趣的,并且一直在閱讀大量有關(guān)Swift的博客文章并進(jìn)行實(shí)踐的中級(jí)工程師。

              高級(jí):適合那些以探索Swift語言知識(shí)為樂趣,挑戰(zhàn)自己,使用前言技術(shù)的人們。

              假如你想回答這些問題,我建議你在回答這些問題之前,打開Playground運(yùn)行一下這些問題的代碼。這些問題的答案都在Xcode 7.0 Beta 6 版本中測試過。

              準(zhǔn)備好了嗎?系好安全帶,現(xiàn)在就開始!

              筆試問題

              初學(xué)者

              問題1、(Swift 1.0及其之后的版本的問題)有什么更好的方法來寫下面的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

              問題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是一個(gè)類,會(huì)有什么不同?并說明原因。

              答案:tutorial1.difficulty 的值是1,然而tutorial2.difficulty的值是2.

              在Swift中結(jié)構(gòu)體是值類型,他們的值是復(fù)制的而不是引用的。下面的一行代碼意思是復(fù)制了tutorial1的值并把它賦值給tutorial2:

              var tutorial2 = tutorial1

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

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

              問題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的屬性,也就是說最后一行代碼是可以編譯的:

              let view2 = UIView()

              view2.alpha = 0.5 // Yes!

              問題4 – Swift 1.0 or later

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

              let animals = ["fish", "cat", "chicken", "dog"]

              let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in

              return one < two

              }

              答案:

              第一個(gè)簡化的是參數(shù)。系統(tǒng)的參數(shù)類型推斷功能,可以計(jì)算出閉包里面參數(shù)的類型,所以你不必定義參數(shù)的類型:

              let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two }

              函數(shù)返回值也可以被推斷出來,所以簡化掉,代碼變?yōu)椋?/p>

              let sortedAnimals = animals.sort { (one, two) in return one < two }

              這個(gè)$i 符號(hào)可以代替參數(shù)名字,代碼進(jìn)一步簡化為:

              let sortedAnimals = animals.sort { return $0 < $1 }

              在一個(gè)獨(dú)立的閉包內(nèi),return這個(gè)關(guān)鍵字是可以省略的。最后聲明的返回值就是閉包的返回值:

              let sortedAnimals = animals.sort { $0 < $1 }

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

              對(duì)于字符串,有一個(gè)定義如下的比較函數(shù):

              func Bool

              這個(gè)簡單的小函數(shù)可以使你的代碼簡潔如下:

              let sortedAnimals = animals.sort(<)

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

              問題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è)引用類型類,所以無論你是通過ray或者brain訪問headquarters,訪問都是同一個(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í)

              問題1– Swift 2.0 or later

              思考下面的代碼:

              var optional1: String? = nil

              var optional2: String? = .None

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

              nil == .None // On Swift 1.x this doesn't compile. You need Optional

              .None

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

              enum Optional{

              case None

              case Some(T)

              }

              問題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)

              但是這段代碼編譯失敗了,請問哪里報(bào)錯(cuò),出錯(cuò)的原因是什么。

              建議:在使用Playground之前,認(rèn)真閱讀代碼并思考。

              答案:代碼的最后一行不會(huì)被編譯通過。ThermometerStruct結(jié)構(gòu)體中正確的聲明了一個(gè)mutating屬性函數(shù),它是用來改變結(jié)構(gòu)體內(nèi)部temperature屬性的值的,但是編譯器不通過的原因是,通過let創(chuàng)建的不可變的registerTemperature結(jié)構(gòu)體調(diào)用了registerTemperature函數(shù)。

              問題3– Swift 1.0 or later

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

              var thing = "cars"

              let closure = { [thing] in

              print("I love \(thing)")

              }

              thing = "airplanes"

              closure()

              答案:輸出的是:I love cars。當(dāng)閉包被聲明的時(shí)候,抓捕列表就復(fù)制一份thing變量,所以被捕捉的值并沒有改變,即使你給thing賦了一個(gè)新值。

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

              var thing = "cars"

              let closure = {

              print("I love \(thing)")

              }

              thing = "airplanes"

              closure() // Prints "I love airplanes"

              問題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í)際類型,也就是說T必須遵循Comparable協(xié)議。你可以這樣使用它:

              countUniques([1, 2, 3, 3]) // result is 3

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

              [1, 2, 3, 3].countUniques() // should print 3

              如何實(shí)現(xiàn)?

              答案:在Swift 2.0 中,泛類型可以使用類型約束條件被強(qiáng)制擴(kuò)展。但是假如這個(gè)泛類型不滿足這個(gè)類型的約束條件,那么這個(gè)擴(kuò)展方法既不可見也無法調(diào)用。

              所以countUniques全局函數(shù)可以作為Array的擴(kuò)展方法被重寫如下:

              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 doesn't implement Comparable

              問題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!

              }

              上面的函數(shù)可以正常使用,但是會(huì)存在兩個(gè)問題:


              熱門推薦

              最新文章