可能碰到的iOS筆試面試題(9)--Swift

Swift

網(wǎng)上有很多Swift的語法題,但是Swift現(xiàn)在語法還未穩(wěn)定,所以在這里暫時不貼出語法題,可以自行搜索。

Swift和Objective-C的聯(lián)系

  • Swift與Objective-C共用同一套運行時環(huán)境
    我們編寫程序,讓程序運行起來,被機器執(zhí)行的代碼并非全部是由我們自己來編寫的。需要同時運行很多預先寫好的支持性的代碼,才能讓我們自己的代碼運行起來。程序并非單獨存在的,運行時處在一定的環(huán)境當中。我總聯(lián)想到很多小螞蟻在泥土上面爬,而我自己寫的程序只是其中的一只。
    Swift跟Objective-C編譯出的程序代碼運行在同一套運行環(huán)境上面。Swift的類型可以橋接到Objective-C的類型,反之亦然。Swift編寫的代碼可以調(diào)用Objective-C編寫的代碼,反之也一樣。
    Objective-C之前積累下來的大量類庫,實現(xiàn)不用改寫Swift就可以直接調(diào)用。
  • 同一個工程,可以同時使用Swift和Objective-C
    Objective-C在一端,Swift在另一端,兩端經(jīng)中間文件進行橋接。橋接文件包含Objective-C的頭文件,編譯時自動轉(zhuǎn)成Swift可以識別的形式。Swift就可以使用Objective-C的類和它的函數(shù)。
    在Swift的類中,加上@objc(類名)的字樣,Objective-C也可以使用Swift編寫的類。但Swift跟C++的相互調(diào)用,需要Objective-C來封裝。
  • Swift骨子里大多與Objective-C一樣
    Objective-C出現(xiàn)過的絕大多數(shù)概念,比如引用記數(shù)、ARC、屬性、協(xié)議、接口、初始化、擴展類、命名參數(shù)、匿名函數(shù)等,在Swift中繼續(xù)有效(可能只是換了個術語)。我自己將Swift看成是Objective-C的一塊大大的語法糖,其他人可能有不同感受。
    Swift大多數(shù)概念與Objective-C一樣,也有些概念在Objective-C找不到對應,比如泛型。Swift中將那種操作寫一次就可以作用多個類型的語法叫做Generics(泛型)。

Swift比Objective-C有什么優(yōu)勢?

  • Swift 容易閱讀
    不再需要行尾的分號,以及 if/else 語句中圍繞條件表達式的括弧。另外就是方法的調(diào)用不再互相嵌套成中括號[[[ ]]]。Swift 中的方法和函數(shù)的調(diào)用使用行業(yè)內(nèi)標準的在一對括弧內(nèi)使用逗號分隔的參數(shù)列表。這樣做的結(jié)果就是一種帶有簡化了句法和語法的更加干凈有表現(xiàn)力的語言。
  • Swift 更易于維護
    Swift 丟掉了對著兩個文件的要求。 Xcode編譯器可以自動計算出以來并執(zhí)行增量構建。如此,將頭文件 同實現(xiàn)文件相分離。把 Objective-C 頭文件(.h) 和實現(xiàn)文件 (.m) 合并成了一個代碼文件 (.swift)
  • Swift 更加安全
    Swift代碼中的可選類型使得一個nil可選值的可能性變得非常的明確, 這意味它能在你寫下一段糟糕的代碼時會生成一個編譯器錯誤. 這就建立了一種短程反饋的循環(huán),可以讓程序員帶著目標去寫代碼. 問題在代碼被寫就時就可以被修復, 這大大節(jié)省了你要在修復有關來自 Objective-C 指針邏輯的bug時需要耗費的時間和金錢.
  • Swift 代碼更少
    Swift 減少了重復性語句和字符串操作所需要的代碼量。在 Objective-C 中, 使用文本字符串將兩塊信息組合起來的操作非常繁瑣。Swift 采用當代編程語言的特性,比如使用“+”操作符將兩個字符串加到一起
    Swift中的類型系統(tǒng)減少了代碼語句的復雜性--作為編譯器可以理解的類型。比如,Objective-C要求程序員記住特殊字符標記(%s,%d,%@)并且提供了一個用逗號分隔的變量來代替每個標記。Swift支持字符串插入,這就消除了需要記住的標記和允許程序員直接插入變量到面向用戶的字符串中
  • Swift 速度更快
    刪除遺留下來的C語言約定大大提升了引擎蓋之下Swift的性能, 進行計算密集型任務的性能上,Swift已經(jīng)逼近C++的表現(xiàn), 將近是OC運行速度的1.4倍.
  • 總結(jié): 使用 Swift,程序員只要維護原來一半量的代碼文件,手動的代碼同步工作為零,標點輸入出錯的概率也遠遠低于以前 -- 這樣就能騰出更多的時間寫高質(zhì)量的代碼。通過使用可選類型 —— 一種針對返回或不返回值的編譯時安全機制,而返回值是同步操作、網(wǎng)絡失效時無效的用戶輸入以及數(shù)據(jù)驗證錯誤發(fā)生時普遍會遇到的問題。ARC 在 Swift 中對過程式 C 風格的代碼,還有蘋果公司 Cocoa 框架使用的面向?qū)ο蟠a都進行了統(tǒng)一。

Swift的內(nèi)存管理是怎樣的?

  • Swift 使用自動引用計數(shù)(Automatic Reference Counting, ARC)來簡化內(nèi)存管理, 這種內(nèi)存管理方式相比GC而言,對程序員的要求較高, 并且ARC比GC更容易引起編程錯誤,但卻比GC快。尤其在性能很重要的場合。

Swift支持面向過程編程嗎?

  • 它采用了 Objective-C 的命名參數(shù)以及動態(tài)對象模型,可以無縫對接到現(xiàn)有的 Cocoa 框架,并且可以兼容 Objective-C 代碼,支持面向過程編程和面向?qū)ο缶幊獭?/li>

舉例說明Swift里面有哪些是 Objective-C中沒有的?

  • Swift引入了在Objective-C中沒有的一些高級數(shù)據(jù)類型,例如tuples(元組),可以使你創(chuàng)建和傳遞一組數(shù)值。
  • Swift還引入了可選項類型(Optionals),用于處理變量值不存在的情況??蛇x項的意思有兩種:一是變量是存在的,例如等于X,二是變量值根本不存在。Optionals類似于Objective-C中指向nil的指針,但是適用于所有的數(shù)據(jù)類型,而非僅僅局限于類,Optionals 相比于Objective-C中nil指針更加安全和簡明,并且也是Swift諸多最強大功能的核心。

Swift 是一門安全語言嗎?

  • Swift是一門類型安全的語言,Optionals就是代表。Swift能幫助你在類型安全的環(huán)境下工作,如果你的代碼中需要使用String類型,Swift的安全機制能阻止你錯誤的將Int值傳遞過來,這使你在開發(fā)階段就能及時發(fā)現(xiàn)并修正問題。

為什么要在變量類型后面加個問號?

  • 用來標記這個變量的值是可選的,一般用“!”和“?”定義可選變量的區(qū)別:用“!”定的可選變量必須保證轉(zhuǎn)換能夠成功,否則報錯,但定義的變量可以直接使用,不會封裝在option里;而用“?”號定的可選變量即使轉(zhuǎn)換不成功本身也不會出錯,變量值為nil,如果轉(zhuǎn)換成功,要使用該變量進行計算時變量名后需要加“!”

什么是泛型,它們又解決了什么問題?

  • 泛型是用來使代碼能安全工作。在Swift中,泛型可以在函數(shù)數(shù)據(jù)類型和普通數(shù)據(jù)類型中使用,例如類、結(jié)構體或枚舉。
  • 泛型解決了代碼復用的問題。有一種常見的情況,你有一個方法,需要一個類型的參數(shù),你為了適應另一種類型的參數(shù)還得重新再寫一遍這個方法。
    比如,在下面的代碼中,第二個方法是第一個方法的“克隆體”:
func areIntEqual(x: Int, _ y: Int) -> Bool {
  return x == y
}
func areStringsEqual(x: String, _ y: String) -> Bool {
  return x == y
}
areStringsEqual("ray", "ray") // true
areIntEqual(1, 1) // true

一個Objective-C開發(fā)者可能會采用NSObject來解決問題:

-   import Foundation
-   func areTheyEqual(x: NSObject, _ y: NSObject) -> Bool {
-     return x == y
-   }
-   areTheyEqual("ray", "ray") // true
-   areTheyEqual(1, 1) // true

這段代碼能達到了目的,但是編譯的時候并不安全。它允許一個字符串和一個整型數(shù)據(jù)進行比較:

-   areTheyEqual(1, "ray")
//程序可能不會崩潰,但是允許一個字符串和一個整型數(shù)據(jù)進行比較可能不會得到想要的結(jié)果。
采用泛型的話,你可以將上面兩個方法合并為一個,并同時還保證了數(shù)據(jù)類型安全。這是實現(xiàn)代碼:
-   func areTheyEqual<T: Equatable>(x: T, _ y: T) -> Bool {
-     return x == y
-   }
-   areTheyEqual("ray", "ray")
-   areTheyEqual(1, 1)```

文章如有問題,請留言,我將及時更正。

滿地打滾賣萌求贊,如果本文幫助到你,輕點下方的紅心,給作者君增加更新的動力。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,579評論 30 472
  • 2016年3月13日,距高考86天 在完全不知道時間的情況下學習是怎樣一種體驗? 今天我是體驗到了。 上午去圖書館...
    獵手Eric閱讀 553評論 0 0
  • 創(chuàng)建項目目錄 在本地創(chuàng)建項目目錄,例如在D盤中創(chuàng)建Project目錄。創(chuàng)建完成后,進入下一步初始化代碼倉庫。 初始...
    偉仔1986閱讀 177評論 0 0
  • 當我已經(jīng)不再校園這個襁褓里,已經(jīng)長大遠去,踏出校園的大門,走向社會,朝著夢奔跑。 已經(jīng)不在坐教室,認真的看向黑板;...
    Witches小呆閱讀 257評論 0 0
  • 雪紛紛灑灑的到了人間,而三年前的初雪也是這這般,無所謂的、灑脫的。 三年前,剛上大學的我,稚嫩的、鮮活的,更是有沖...
    夔瑾安閱讀 247評論 0 1

友情鏈接更多精彩內(nèi)容