1. 程式人生 > >Swift面試題,看這些就夠了

Swift面試題,看這些就夠了

最近看到一篇寫swift面試題的文章,寫的非常好,特此翻譯過來供大家查閱,每個問題都會提供答案。

書面問題

初學者

Question #1

請用更好的方式寫這個for迴圈:

for var i = 0; i < 5; i++ {
  print("Hello!")
}

Answer:

for _ in 0...4 {
  print("Hello!")
}
Swift實現了兩個範圍操作符,閉合操作符和半開操作符。 第一個包括範圍中的所有值。 例如,以下包括從0到4的所有整數:
0 ... 4
半開操作符不包括最後一個元素。 以下產生相同的0到4結果:
0 .. <5

Question #2

考慮下面的程式碼:

struct Tutorial {
  var difficulty: Int = 1
}
 
var tutorial1 = Tutorial()
var tutorial2 = tutorial1
tutorial2.difficulty = 2

tutorial1.difficulty和tutorial2.difficulty的值是什麼? 如果Tutorial是一個類,這將是什麼不同? 為什麼?

Answer:

tutorial1.difficulty是1,而tutorial2.difficulty是2。


Swift中的結構是值型別,它們通過值而不是引用來複制。 以下行建立tutorial1的copy並將其分配給tutorial2:

var tutorial2 = tutorial1
從這一行開始,對tutorial2的任何更改都不會反映在tutorial1中。
如果Tutorial是一個類,tutorial1.difficulty和tutorial2.difficulty將是2.在Swift中的類是引用型別。 對tutorial1的屬性的任何更改都將反映到tutorial2中,反之亦然。

Question #3

view1用var宣告,view2用let宣告。 這裡有什麼區別,最後一行會編譯?

import UIKit
 
var view1 = UIView()
view1.alpha = 0.5
 
let view2 = UIView()
view2.alpha = 0.5 // Will this line compile?

Answer:

view1是一個變數,可以重新分配給一個新的UIView例項。 通過讓你只能賦值一次,所以下面的程式碼不編譯:

view2 = view1 // Error: view2 is immutable
但是,UIView是一個具有引用語義的類,所以你可以改變view2的屬性(這意味著最後一行將編譯):
let view2 = UIView()
view2.alpha = 0.5 // Yes!


Question #4

此程式碼按字母順序對名稱陣列進行排序,看起來很複雜。 儘可能簡化它和關閉。

let animals = ["fish", "cat", "chicken", "dog"]
let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in
  return one < two
}

Answer:

第一個簡化與引數有關。型別推理系統可以計算閉包中的引數的型別,所以你可以擺脫它們:

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 <(lhs: String, rhs: String) -> Bool
這個整潔的小函式使你的程式碼像下面這樣容易:
let sortedAnimals = animals.sort(<)
請注意,此漸進的每個步驟都會編譯並輸出相同的結果,並且您建立了一個字元閉包!

Question #5

此程式碼建立兩個類,Address和Person,它建立兩個例項來表示Ray和Brian。

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)
假設Brian移動到街對面的新建築,所以你更新程式碼如下:
brian.address.fullAddress = "148 Tutorial Street"

問題是,這樣做有什麼問題嗎?

Answer:

ray也搬到了新大樓! Address是一個類,有引用語義,所以headquarters是相同的例項,無論你通過ray或brian訪問它。 改變headquarters的地址將改變它們。 你能想象如果brian得到ray的郵件會發生什麼,反之亦然? 
解決方案是建立一個新的地址分配給Brian,或者將Address宣告為結構體而不是類。

中場:

現在要加大難度了。 你準備好了嗎?

Question #1

考慮下面的程式碼:

var optional1: String? = nil
var optional2: String? = .None

nil和.None之間有什麼區別? optional1和optional2變數如何不同?

Answer:

沒有什麼區別。 Optional 、None(.None)是初始化缺少值的可選變數的正確方法,而nil僅僅是.None的語法糖。
事實上,參考下面程式碼:

            
           

相關推薦

Swift試題這些

最近看到一篇寫swift面試題的文章,寫的非常好,特此翻譯過來供大家查閱,每個問題都會提供答案。 書面問題 初學者 Question #1 請用更好的方式寫這個for迴圈: for var i = 0; i < 5; i++

遷移學習(Transformer)面試這些!(附程式碼)

1. 什麼是遷移學習 遷移學習(Transformer Learning)是一種機器學習方法,就是把為任務 A 開發的模型作為初始點,重新使用在為任務 B 開發模型的過程中。遷移學習是通過從已學習的相關任務中轉移知識來改進學習的新任務,雖然大多數機器學習演算法都是為了解決單個任務而設計的,但是促進遷移學習的演

關於VIM知道這些

VIM基本操作 打開文件 vim [option] file +n. :打開文件後,讓光標處於第n.行的行首,+默認行尾 \\ vim +5 file 打開file並讓光標處在第5行 進入插入模式 i \\ 在光標處輸入

App預覽製作

序: 概覽 :         App 預覽使用錄屏的內容來展示您的 app 的特性,功能,以及使用者介面。您可以為您的 app 支援的每種語言展示最多三個 App 預覽,每段預覽視訊的時長可達 30 秒。藉

十大經典排序演算法動畫

點選上方“程式人生”,選擇“置頂公眾號” 第一時間關注程式猿(媛)身邊的故事 圖片源自:モブサイコ100 作者 程式設計師小吳 如需轉載,請聯絡我們。 在前面的章節中詳細的講解分析了十大經典排序演算法,本文將進行一個大總結。 Tip&n

十大經典排序算法動畫與解析!(配代碼完全版)

實現 insert 個數 while ets 函數 cep lec nbsp GitHub Repo:Sort Article Follow: MisterBooo · GitHub 排序算法是《數據結構與算法》中最基本的算法之一。 排序算法可以分為內部排序和

十大經典排序演算法動畫與解析!(配程式碼完全版)

GitHub Repo:Sort Article Follow: MisterBooo · GitHub 排序演算法是《資料結構與演算法》中最基本的演算法之一。 排序演算法可以分為內部排序和外部排序。 內部排序是資料記錄在記憶體中進行排序。 而外部排序是因排序的資料很大,一次不能容納全部的排

關於javascript的原型和原型鏈(二)

溫故 建立物件的三種方式 通過物件直接量 通過new建立物件 通過Object.create() js中物件分為兩種 函式物件 普通物件 仔細觀察如下程式碼 function Foo(name) { this.name = name; } var fo

安卓混合開發

轉自作者:碼客_Yang 連結:http://www.jianshu.com/p/0b986d6e2e17在Android開發中,越來越多的商業專案使用了Android原生控制元件與WebView進行混合開發,當然不僅僅就是顯示一個WebView那麼簡單,有時候還需要本地Java程式碼與HTML中的JavaS

“電腦開機鎖”如何取消這裡怎樣實現電腦開機密碼的取消

生活中我們每每都會有自己的隱私,在電腦上面也不例外。電腦能夠存放各種各樣的檔案,以及是通往網路世界的橋樑,讓我們更好的瞭解欣賞世界。優勢我們會為了安全將自己電腦設定上開機密碼,而過一段時間有想要將密碼取消,那麼現在就為大家帶來怎樣實現電腦開機密碼的取消。 電腦密碼的取消,需要我

如何修改京東繫結的手機號這裡怎樣更改京東繫結的手機號

網路資訊的多元化,讓人們的生活多姿多彩,購物軟體的誕生,讓人們的在家購物得到實現,京東,一個購物軟體,在京東上會繫結我們的手機號,那如果更改手機號就需要更變繫結的手機號了,下面我將分享一下如何更改京東繫結手機號? 首先,開啟手機京東軟體並登陸,在主頁中會五個功能欄,找到【我的】

怎樣禁止不必要的程式執行這裡如何令電腦程式禁止執行

電腦的使用讓我們的生活得到了極大的快捷與便利,如今的電腦辦公更加成為了工作的主旋律。那麼在辦公時總想要令人們都能夠安心的進行工作,所以就有必要將一部分程式禁止執行,那麼現在就為大家講解下如何令電腦程式禁止執行。 快捷鍵的使用能夠極大的幫助我們節省查詢的時間。此時快捷鍵“wind

怎樣快速掌握WORD的常用功能這裡常見的一些word使用小技巧

軟體的使用,比如word,word強大的文件處理能力,讓word的使用頻率大大增加,現在我將介紹幾種word中常用的幾種使用小技巧。 快速查詢某些關鍵字所在位置。 (1)第一步開啟word文件,按下【Ctrl+F】鍵,在文件側方會彈出【導航】欄 (2)第二步,在【導航】

移動Web UI庫(H5框架)有哪些這裡

前言 今年上半年,專案組在專案開發的過程中建立了一套風格統一,元件豐富完善,命名統一規範的PC端UI庫,適用於做大型站點,該UI庫也是應用到了整個平臺的專案中,在各個專案組中進行推廣。因為專案的保密性,這裡不方便給出實際專案,當然目前這套UI庫也不是開源的。

iOS與網頁JS互動

隨著移動APP的快速迭代開發趨勢,越來越多的APP中嵌入了html網頁,但在一些大中型APP中,尤其是電商類APP,html頁面已經不僅僅滿足展示功能,這時html要求能與原生語言進行互動、相互傳值。比如攜程APP中一個熱門景點的網頁中,點選某個景點,

最新阿裏Java技術試題這一文

重載 系統 java 開發 搜索框 分代 公司 poll arr oscache 金三銀四跳槽季即將到來,作為 Java 開發者你開始刷面試題了嗎?別急,小編整理了阿裏技術面試題,看這一文就夠了! 阿裏面試題目目錄 技術一面(基礎面試題目) 技術二面(技術深度、技術原理

Tomcat相關試題這篇!保證能讓面試官顫抖!

Tomcat相關的面試題出場的機率並不高,正式因為如此,很多人忽略了對Tomcat相關技能的掌握。 這次整理了Tomcat相關

Java長見到的試題你能答出幾題知道自己有多菜

作者:Java3y 前言 只有光頭才能變強 Redis目前還在看,今天來分享一下我在秋招看過(遇到)的一些面試題(相對比較常見的) 0、final關鍵字 簡要說一下final關鍵字,final可以用來修飾什麼? 這題我是在真實的面試中遇到的,當時答得不太好,現在來整理一

大數據這個

性能 語言 order nbsp 人工 之間 hdf ima 數據運維 2016年5月25日上午,由貴州省政府舉辦的以"大數據開啟智能時代"為主題的中國大數據產業峰會在貴陽開幕,國務院總理李克強發表主旨演講。騰訊集團馬化騰,高通公司總裁Derek Aberle,百度

大資料學習線路圖分享自學大資料這裡

學習大資料需要java作為基礎! 一般來說學大資料,首先要學java基礎、javaweb、SSM框架之後在開始大資料的學習。我給你一套大資料的學習線路圖,你從線路圖就能知道java學到什麼程式設計師就可以學大資料了! 大資料學習線路圖總