答“卓同學的 Swift 面試題”--中篇

接上篇,答“卓同學的 Swift 面試題”--上篇
面試題鏈接:卓同學的 Swift 面試題

在上篇中,回答了基礎篇前11題,接著回答中間12題:

12. String 與 NSString 的關系與區(qū)別
13. 怎么獲取一個 String 的長度
14. 如何截取 String 的某段字符串
15. throws 和 rethrows 的用法與作用
16. try? 和 try!是什么意思
17. associatedtype 的作用
18. 什么時候使用 final
19. public 和 open 的區(qū)別
20. 聲明一個只有一個參數沒有返回值閉包的別名
21. Self 的使用場景
22. dynamic 的作用
23. 什么時候使用 @objc
12. String 與 NSString 的關系與區(qū)別

Swift 的String類型與 Foundation NSString類進行了無縫橋接。他們最大的區(qū)別就是:String是值類型,而NSString是引用類型。
其他方面的差異就體現在各自api 上的差異。

13.怎么獲取一個 String 的長度
let length1 = "string".characters.count
let length2 = "string".data(using: .utf8).count
let length3 = ("string" as NSString).length
14. 如何截取 String 的某段字符串

每一個String值都有一個關聯的索引(index)類型,String.Index,它對應著字符串中的每一個Character的位置
具體參見:Accessing and Modifying a String

15.throws 和 rethrows 的用法與作用
  • throw異常,這表示這個函數可能會拋出異常,無論作為參數的閉包是否拋出異常
  • rethrow異常,這表示這個函數本身不會拋出異常,但如果作為參數的閉包拋出了異常,那么它會把異常繼續(xù)拋上去
public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
16. try? 和 try!是什么意思

** try? ** 是用來修飾一個可能會拋出錯誤的函數。會將錯誤轉換為可選值,當調用try?+函數或方法語句時候,如果函數或方法拋出錯誤,程序不會發(fā)崩潰,而返回一個nil,如果沒有拋出錯誤則返回可選值
** try! ** 會忽略錯誤傳遞鏈,并聲明“do or die”。如果被調用函數或方法沒有拋出異常,那么一切安好;但是如果拋出異常,二話不說,給你崩
參考:what's difference in try! and try?

17. associatedtype 的作用

Swift中的協議(protocol)采用的是“Associated Types”的方式來實現泛型功能的

18. 什么時候使用 final
  • 通過使用final提升程序性能,其實就算把所有不需要繼承的方法、類都加上final關鍵字,效果也是微乎其微。
  • final 的正確使用場景-----權限控制, 具體情況如下:
    1. 類或者方法的功能確實已經完備了
    通常是一些輔助性質的工具類或者方法,比如MD5加密類這種,算法都十分固定,我們基本不會再繼承和重寫
    2. 避免子類繼承和修改造成危險
    3. 為了讓父類中某些代碼一定會執(zhí)行
19. public 和 open 的區(qū)別

** open **

  • open 修飾的 class 在 Module 內部和外部都可以被訪問和繼承
  • open 修飾的 func 在 Module 內部和外部都可以被訪問和重載(override)

** public **

  • public 修飾的 class 在 Module 內部可以訪問和繼承,在外部只能訪問
  • public 修飾的 func 在 Module 內部可以被訪問和重載(override),在外部只能訪問
20. 聲明一個只有一個參數沒有返回值閉包的別名
typealias IntBlock = (Int) -> Void
21. Self 的使用場景
  • 協議中聲明
protocol Hello {
    func hello() -> Self
}
  • 協議擴展
protocol MyProtocol { }
extension MyProtocol where Self: UIView { }
22. dynamic 的作用
  • dynamic 可以用來修飾變量或函數,告訴編譯器使用動態(tài)分發(fā)而不是靜態(tài)分發(fā)。
  • 使用動態(tài)分發(fā),可以更好的與OC中runtime的一些特性(如CoreData,KVC/KVO)進行交互
  • 標記為dynamic的變量/函數會隱式的加上@objc關鍵字,它會使用OC的runtime機制
23. 什么時候使用 @objc

在協議中使用 optional 關鍵字作為前綴來定義可選要求??蛇x要求用在你需要和 Objective-C 打交道的代碼中。協議和可選要求都必須帶上@objc屬性。標記 @objc 特性的協議只能被繼承自 Objective-C 類的類或者 @objc 類遵循,其他類以及結構體和枚舉均不能遵循這種協議

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

相關閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,840評論 18 399
  • 1、范型范型所解決的問題 函數、方法、類型:類,結構體,枚舉,元組類型,協議參數,返回值,成員函數參數,成員屬性類...
    我是小胡胡123閱讀 956評論 0 1
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,279評論 0 62
  • 題目: 卓同學的 Swift 面試題 翻了 喵神 和 SwiftGG 的資料, 借鑒了 Arco_vv 和 En...
    青木KON閱讀 2,089評論 3 8
  • 很多東西,越是牢牢抓住越是不能得到。比如愛情。比如我想要的青春。 今年成功的升學做了學姐,比起以往的初中高中這個大...
    不只有愛情閱讀 569評論 0 0

友情鏈接更多精彩內容