高考升学网_国产刚发育娇小性色xxxxx_一个为高考升学提供有价值信息的网站

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

Swift 面試題及其答案

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

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

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

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

  這些問題包含兩個方面:

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

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

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

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

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

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

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

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

  筆試問題

  初學者

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

  for var i = 0; i < 5; i++ {

  print("Hello!")

  }

  答案:

  for _ in 0...4 {

  print("Hello!")

  }

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

  0...4

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

  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是一個類,會有什么不同?并說明原因。

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

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

  var tutorial2 = tutorial1

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

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

  問題3 – Swift 1.0 or later

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

  import UIKit

  var view1 = UIView()

  view1.alpha = 0.5

  let view2 = UIView()

  view2.alpha = 0.5 // Will this line compile?

  答案:view1是個變量可以重新賦值給一個新的實例化的UIView對象。使用let你只賦值一次,所以下面的代碼是不能編譯的:

  view2 = view1 // Error: view2 is immutable

  但是UIView是一個引用類型的類,所以你可以改變view2的屬性,也就是說最后一行代碼是可以編譯的:

  let view2 = UIView()

  view2.alpha = 0.5 // Yes!

  問題4 – Swift 1.0 or later

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

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

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

  return one < two

  }

  答案:

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

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

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

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

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

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

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

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

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

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

  func Bool

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

  let sortedAnimals = animals.sort(<)

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

  問題5 – Swift 1.0 or later

  下面的代碼創建了兩個類Address和Person,并且創建了兩個實例對象分別代表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搬家到街對面的建筑物里,那么你會這樣更新他的地址:

  brian.address.fullAddress = "148 Tutorial Street"

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

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

  中級

  問題1– Swift 2.0 or later

  思考下面的代碼:

  var optional1: String? = nil

  var optional2: String? = .None

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

  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作為類和結構體的例子:

  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)

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

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

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

  問題3– Swift 1.0 or later

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

  var thing = "cars"

  let closure = { [thing] in

  print("I love \(thing)")

  }

  thing = "airplanes"

  closure()

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

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

  var thing = "cars"

  let closure = {

  print("I love \(thing)")

  }

  thing = "airplanes"

  closure() // Prints "I love airplanes"

  問題4– Swift 2.0 or later

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

  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

  }

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

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

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

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

  如何實現?

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

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

  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

  }

  }

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

  import UIKit

  let a = [UIView(), UIView()]

  a.countUniques() // compiler error here because UIView doesn't implement Comparable

  問題5- Swift 2.0 or later

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

  被除數必須包含nil值

  除數必須為包含nil值

  除數不能為零

  func divide(dividend: Double?, by divisor: Double?) -> Double? {

  if dividend == .None {

  return .None

  }

  if divisor == .None {

  return .None

  }

  if divisor == 0 {

  return .None

  }

  return dividend! / divisor!

  }

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


最新圖文

常見的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
主站蜘蛛池模板: 中科先农农业(河北)智能设备有限责任公司 | 九江市京邦玻纤有限公司 | 阴_阳离子聚丙烯酰胺价格_聚合氯化铝厂家_聚合硫酸铁-巩义市亿洋水处理材料有限公司 | 杀菌剂_除藻剂_杀菌灭藻剂_1227杀菌剂_中北精细化工 | 清洗剂-防锈油-润滑油-嘉信供应链一站式供应厂家 | 消防排烟风机|3C排烟风机|正压送风机|高温排烟风机|柜式排烟风机-山东锦松环境设备有限公司 | 液体灌装机-酱料灌装机-全自动灌装机-旋盖机-铝箔封口机-贴标机厂家-迈特威自动化设备(天津)有限公司" | 济宁卡尔迪机械制造有限公司_铁路换枕机_升降驾驶室_挖机加高底盘_加长臂 | 万通汽车学校,汽车学校,汽修学校,汽修培训学校,汽车美容学校,汽车维修学校,学汽修-武汉万通汽车学校官方网站 | 永磁变频空压机_青岛空压机_螺杆空压机_口罩专用空压机-青岛凯瑞特机电设备有限公司 | 西安测试仪-西安电压测试仪-西安电流测试仪-西安热油汽水测试仪-西安阻抗测试仪-西安时间速度测试仪-西安电力设备厂家-西安中洲电力设备有限公司 | 银泰洁净--净化工程总承包,20年精耕细作,专为净化而来_银泰洁净--净化工程总承包,20年精耕细作,专为净化而来 | 专业生产安检门-X光机-防爆罐-金属探测门-中警思创军警装备厂家 专业色素炭黑生产厂家,提供各种用途色素炭黑价格-枣庄鑫源化工 专业护工_医院护工_护工陪护_住家护工- 心陪护 | 铁氟龙膜/板/棒-铁氟龙网带/胶带/胶布-[东莞华氟]专注铁氟龙及特氟龙制品生产 | 人工草坪_施工围挡_体育场围网-人工草坪厂家菲斯福 | 微机保护装置_发电机保护_变压器保护_逆功率保护_防孤岛保护装置_光伏发电_杭州继保电气集团有限公司 | 欧路哲门窗|佛山欧路哲门窗有限公司|专业门窗定制品牌 | 限矩型液力偶合器_调速型液力偶合器_摩擦型耦合器生产厂家-河南省华升矿机有限公司 | 深山工作室提供网络投票系统|微信公众号投票|微信公众号小程序|抖音小程序|百度小程序|微信公众号开发|企业网站建设 | 耐磨锤头|合金锤头|高铬耐磨锤头|破碎机锤头|双金属双液复合锤头_巩义东辰实业 合金耐磨锤头铸造厂 | 起名字典|宝宝新生儿男孩女孩起名免费网-诗经周易生辰八字取名字大全 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 中派康明斯发电机_玉柴发电机厂家_静音移动拖车发电机-深圳市斯坦福电力设备有限公司 | 首页|广东蒙泰高新纤维股份有限公司|丙纶细旦丝|丙纶异形丝|丙纶FDY网络丝 - 广东蒙泰高新纤维股份有限公司 | 苏州涂附磨具厂家-陶瓷磨具-树脂磨具批发-苏州磨料磨具-苏州远东砂轮有限公司 | 浙江世杰阀门有限公司| 浙江桥梁检测车出租_杭州桥检车出租_桥梁检测车出租_桥检车租赁_桥梁检测车租赁-广州众诚设备租赁有限公司 | 微波烘干设备厂家-微波烘干干燥设备-山东邦普机械设备有限公司 | 洗地机_扫地机_扫地车品牌_尘推车_工业吸尘器_山东鼎洁盛世 | 混凝土布料机,隧道布料机,衬砌台车布料装置 - 河北聚力智能装备有限公司 | 今日标准_走心机_数控走心机_车铣复合_厂家_深圳今日标准官方网站 | 销售系统_营销系统_自动营销软件_b2b营销系统_数字营销平台_AI销售 | 户外工程照明|洗墙灯厂家|聚翔(广东)照明科技有限公司 | 金酱酒_金酱酒代理加盟招商_OEM贴牌企业定制! – 金酱酒代理加盟!茅台镇较早的酿酒烧坊,年产优质酱香白酒5000余吨,仁怀市十强白酒企业,主营主品:金酱酒、金酱陈香酒、酱香老酒等系列品牌产品 | 联想南京总代理-联想服务器|联想电脑笔记本代理商|联想工作站|dell服务器|HP服务器|南京IBM代理商|IBM V5000存储总包销-南京宇宽科技有限公司 | 山东万利精密机械制造有限公司-高速金属圆锯机,数控高速圆锯机,高速圆锯机生产厂家 | 连云港海盛石英科技有限公司| 中派康明斯发电机_玉柴发电机厂家_静音移动拖车发电机-深圳市斯坦福电力设备有限公司 | 丝杆升降机-蜗轮丝杆升降机-电动推杆-德州市金宇机械有限公司 | 树脂门|卫浴门|医院门|医院专用门|卫生间门—湖南航天康达树脂门 | 江苏美鑫食品科技有限公司|