激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

Swift筆試試題及其答案

時(shí)間:2024-11-04 22:24:51 詩(shī)琳 筆試題目 我要投稿
  • 相關(guān)推薦

Swift筆試試題及其答案

  在學(xué)習、工作中,我們需要用到試題的情況非常的多,借助試題可以更好地考查參試者所掌握的知識和技能。什么類(lèi)型的試題才能有效幫助到我們呢?下面是小編收集整理的Swift筆試試題及其答案,僅供參考,大家一起來(lái)看看吧。

Swift筆試試題及其答案

  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í)現了兩個(gè)數組運算符closed operator 和 half-operator.前者包含數組中得所有值。例如:下面的例子包含從0到4得所有整數

  0...4

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

  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è)類(lèi),會(huì )有什么不同?并說(shuō)明原因。

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

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

  var tutorial2 = tutorial1

  從這一行開(kāi)始,tutorial2值得改變并不影響tutorial1的值。

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

  問(wèn)題3 – Swift 1.0 or later

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

  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對象。使用let你只賦值一次,所以下面的代碼是不能編譯的:

  view2 = view1 // Error: view2 is immutable

  但是UIView是一個(gè)引用類(lèi)型的類(lèi),所以你可以改變view2的屬性,也就是說(shuō)最后一行代碼是可以編譯的:

  let view2 = UIView()

  view2.alpha = 0.5 // Yes!

  問(wèn)題4 – Swift 1.0 or later

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

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

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

  return one < two

  }

  答案:

  第一個(gè)簡(jiǎn)化的是參數。系統的參數類(lèi)型推斷功能,可以計算出閉包里面參數的類(lèi)型,所以你不必定義參數的類(lèi)型:

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

  函數返回值也可以被推斷出來(lái),所以簡(jiǎn)化掉,代碼變?yōu)椋?/p>

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

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

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

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

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

  這簡(jiǎn)化很多了,但是我們不能止步于此!

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

  func Bool

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

  let sortedAnimals = animals.sort(<)

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

  問(wèn)題5 – Swift 1.0 or later

  下面的代碼創(chuàng )建了兩個(gè)類(lèi)Address和Person,并且創(chuàng )建了兩個(gè)實(shí)例對象分別代表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)

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

  brian.address.fullAddress = "148 Tutorial Street"

  這樣做將會(huì )發(fā)生什么?錯誤出在什么地方呢?

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

  中級

  問(wèn)題1– Swift 2.0 or later

  思考下面的代碼:

  var optional1: String? = nil

  var optional2: String? = .None

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

  nil == .None // On Swift 1.x this doesnt compile. You need Optional

  .None

  記住枚舉類(lèi)型的Optional下的None:

  enum Optional{

  case None

  case Some(T)

  }

  問(wèn)題2-Swift 1.0 or later

  下面是thermometer作為類(lèi)和結構體的例子:

  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)

  但是這段代碼編譯失敗了,請問(wèn)哪里報錯,出錯的原因是什么。

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

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

  問(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。當閉包被聲明的時(shí)候,抓捕列表就復制一份thing變量,所以被捕捉的值并沒(méi)有改變,即使你給thing賦了一個(gè)新值。

  如果你要忽視閉包中捕捉列表的值,那么編譯器引用那個(gè)值而不是復制。這種情況下,被引用變量的值的變化將會(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è)全局函數,這個(gè)函數的功能是計算數組中特殊值得個(gè)數。(待校驗)

  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

  }

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

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

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

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

  如何實(shí)現?

  答案:在Swift 2.0 中,泛類(lèi)型可以使用類(lèi)型約束條件被強制擴展。但是假如這個(gè)泛類(lèi)型不滿(mǎn)足這個(gè)類(lèi)型的約束條件,那么這個(gè)擴展方法既不可見(jiàn)也無(wú)法調用。

  所以countUniques全局函數可以作為Array的擴展方法被重寫(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

  }

  }

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

  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è)函數的功能是計算兩個(gè)double(optional)類(lèi)型的數的相除的結果。在執行除法之前,必須提前滿(mǎn)足三個(gè)條件:

  被除數必須包含nil值

  除數必須為包含nil值

  除數不能為零

  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有什么區別?

  1)Swift是強類(lèi)型(靜態(tài))語(yǔ)言,有類(lèi)型推斷,Objective-C弱類(lèi)型(動(dòng)態(tài))語(yǔ)言

  2)Swift面向協(xié)議編程,Objective-C面向對象編程

  3)Swift注重值類(lèi)型,Objective-C注重引用類(lèi)型

  4)Swift支持泛型,Objective-C只支持輕量泛型(給集合添加泛型)

  5)Swift支持靜態(tài)派發(fā)(效率高)、動(dòng)態(tài)派發(fā)(函數表派發(fā)、消息派發(fā))方式,Objective-C支持動(dòng)態(tài)派發(fā)(消息派發(fā))方式

  6)Swift支持函數式編程(高階函數)

  7)Swift的.協(xié)議不僅可以被類(lèi)實(shí)現,也可以被Struct和Enum實(shí)現

  8)Swift有元組類(lèi)型、支持運算符重載

  9)Swift支持命名空間

  10)Swift支持默認參數

  11)Swift比Objective-C代碼更簡(jiǎn)潔

  2、講講Swift的派發(fā)機制

  1)函數的派發(fā)機制:靜態(tài)派發(fā)(直接派發(fā))、函數表派發(fā)、消息派發(fā)

  2)Swift派發(fā)機制總結:

【Swift筆試試題及其答案】相關(guān)文章:

PHP筆試題及答案02-11

java筆試題及答案08-20

oracle筆試題及答案10-28

華為筆試題及答案11-01

java筆試題及答案02-09

cad筆試試題及答案10-19

高級網(wǎng)管筆試題及答案02-12

PHP筆試題含答案02-11

外貿筆試題目及答案10-17

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频