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

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

在此篇中,回答面試題基礎篇的最后13道題:

24. Optional(可選型) 是用什么實現的
25. 如何自定義下標獲取
26. ?? 的作用
27. lazy 的作用
28. 一個類型表示選項,可以同時表示有幾個選項選中(類似 UIViewAnimationOptions ),用什么類型表示
29. inout 的作用
30. Error 如果要兼容 NSError 需要做什么操作
31. 下面的代碼都用了哪些語法糖
[1, 2, 3].map{ $0 * 2 }
32. 什么是高階函數
33. 如何解決引用循環
34. 下面的代碼會不會崩潰,說出原因
var mutableArray = [1,2,3]
for _ in mutableArray {
  mutableArray.removeLast()
}
35. 給集合中元素是字符串的類型增加一個擴展方法,應該怎么聲明
36. 定義靜態方法時關鍵字 static 和 class 有什么區別
24. Optional(可選型) 是用什么實現的
  • Optional 是個枚舉。有兩個枚舉成員,Some(T)None
  • 通關泛型來兼容所有類型
25. 如何自定義下標獲取

使用subscript語法

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
threeTimesTable[6]  //18
26. ?? 的作用

?? 是空合運算符。
比如a ?? b ,將對可選類型a進行為空判斷,如果a包含一個值,就進行解封,否則就返回一個默認值b。
表達式 a 必須是 Optional 類型。默認值 b 的類型必須要和 a 存儲值的類型保持一致

27. lazy 的作用

使用lazy關鍵字修飾struct 或class 的成員變量,達到懶加載的效果。一般有以下使用場景:

  • 屬性開始時,還不確定是什么活著還不確定是否被用到
  • 屬性需要復雜的計算,消耗大量的CPU
  • 屬性只需要初始化一次
28. 一個類型表示選項,可以同時表示有幾個選項選中(類似 UIViewAnimationOptions ),用什么類型表示

使用選項集合:OptionSet
具體參見:Swift 中的選項集合

29. inout 的作用

可以讓值類型以引用方式傳遞,比如有時需要通過一個函數改變函數外面變量的值,例如:

var value = 50
print(value)  // 此時value值為50

func increment(inout value: Int, length: Int = 10) {
    value += length
}
increment(&value)
print(value)  // 此時value值為60,成功改變了函數外部變量value的值
30. Error 如果要兼容 NSError 需要做什么操作

想讓我們的自定義Error可以轉成NSError,實現CustomNSError就可以完整的as成NSError

/// Describes an error type that specifically provides a domain, code,
/// and user-info dictionary.
public protocol CustomNSError : Error {

    /// The domain of the error.
    public static var errorDomain: String { get }

    /// The error code within the given domain.
    public var errorCode: Int { get }

    /// The user-info dictionary.
    public var errorUserInfo: [String : Any] { get }
}

話說這也是從卓同學的文章摘取來的??: Swift 3必看:Error與NSError的關系

31. 下面的代碼都用了哪些語法糖
[1, 2, 3].map{ $0 * 2 }
  • 尾隨閉包(Trailing Closures), 如果函數的最后一個參數是閉包,則可以省略 ()
  • 如果該閉包只有一行,則可以省略 return
  • 類型推斷,返回值被推斷為Int
  • $0 代表集合的元素
32. 什么是高階函數
  • 接受一個或多個函數作為參數
  • 把一個函數當作返回值
  • 例如Swift中的map flatMap filter reduce
33. 如何解決循環引用

可以使用 weakunowned

“Use a weak reference whenever it is valid for that reference to become nil at some point during its lifetime. Conversely, use an unowned reference when you know that the reference will never be nil once it has been set during initialization.”
在引用對象的生命周期內,如果它可能為nil,那么就用weak引用。反之,當你知道引用對象在初始化后永遠都不會為nil就用unowned

34. 下面的代碼會不會崩潰,說出原因
var mutableArray = [1,2,3]
for _ in mutableArray {
  mutableArray.removeLast()
}

不會崩潰。迭代器?不知道咋解釋。等搞明白再來填上。。。如有知道的,請指教。

35. 給集合中元素是字符串的類型增加一個擴展方法,應該怎么聲明
extension Sequence where Iterator.Element == Int {
    //your code
}

protocol SomeProtocol {}
extension Collection where Iterator.Element: SomeProtocol {
    //your code
}
36. 定義靜態方法時關鍵字 static 和 class 有什么區別
  • staticclass都是用來指定類方法
  • class關鍵字指定的類方法** 可以被 override **
  • static關鍵字指定的類方法** 不能被 override **
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容