Swift面試題及答案(一)基礎(chǔ)知識(shí)

適合基礎(chǔ)入門級(jí)面試準(zhǔn)備:


1. Swift中l(wèi)et和var的區(qū)別是什么?


答案:let用于定義常量,一旦賦值后不可修改;var用于定義變量,賦值后可以修改。


2. 什么是可選類型(Optional)?


答案:可選類型用于表示一個(gè)值“可能存在,也可能不存在(nil)”,通過在類型后加?聲明(如String?)。它是Swift處理“值缺失”的安全方式。


3. 如何安全解包可選類型?


答案:常用方式有兩種:


? 可選綁定(if let/guard let):if let value = optionalValue { ... }


? nil合并運(yùn)算符(??):let result = optionalValue ?? defaultValue

避免使用強(qiáng)制解包(!),否則當(dāng)值為nil時(shí)會(huì)崩潰。


4. 結(jié)構(gòu)體(Struct)和類(Class)的核心區(qū)別是什么?


答案:


? 結(jié)構(gòu)體是值類型(賦值時(shí)復(fù)制數(shù)據(jù)),類是引用類型(賦值時(shí)復(fù)制引用,共享數(shù)據(jù));


? 結(jié)構(gòu)體無繼承,類支持繼承;


? 結(jié)構(gòu)體默認(rèn)生成“成員初始化器”,類需手動(dòng)定義初始化器。


5. Swift的switch語(yǔ)句與Objective-C的switch有何不同?


答案:


? Swift的switch默認(rèn)不穿透(無需寫break);


? 支持多種類型(字符串、枚舉、范圍等),不局限于整數(shù);


? 可通過where子句添加額外條件。


6. 什么是尾隨閉包(Trailing Closure)?


答案:當(dāng)函數(shù)的最后一個(gè)參數(shù)是閉包時(shí),可將閉包寫在函數(shù)括號(hào)外,簡(jiǎn)化代碼。例如:

func doSomething(completion: () -> Void) { ... }

// 尾隨閉包寫法

doSomething {

? ? print("完成")

}

7. 值類型和引用類型的本質(zhì)區(qū)別是什么?


答案:


? 值類型(如struct、enum、String、Array):賦值/傳參時(shí)復(fù)制完整數(shù)據(jù),各自修改不影響對(duì)方;


? 引用類型(如class):賦值/傳參時(shí)復(fù)制引用地址,多個(gè)變量指向同一塊內(nèi)存,修改會(huì)相互影響。


8. 如何定義一個(gè)接收可變數(shù)量參數(shù)的函數(shù)?


答案:使用可變參數(shù)符號(hào)...,參數(shù)會(huì)被當(dāng)作數(shù)組處理。例如:

func sum(numbers: Int...) -> Int {

? ? return numbers.reduce(0, +)

}

sum(1, 2, 3) // 結(jié)果為6

9. 什么是元組(Tuple)?


答案:元組是臨時(shí)存儲(chǔ)多個(gè)不同類型值的集合,可用于快速返回多個(gè)值。例如:

let person = (name: "Alice", age: 25)

print(person.name) // 輸出 "Alice"

10. guard語(yǔ)句的作用是什么?


答案:guard用于“提前退出”,當(dāng)條件不滿足時(shí)執(zhí)行else塊并退出當(dāng)前作用域,可簡(jiǎn)化嵌套判斷。例如:

func checkAge(age: Int?) {

? ? guard let age = age, age >= 18 else {

? ? ? ? print("年齡不合法")

? ? ? ? return

? ? }

? ? print("年齡合法")

}

11. 數(shù)組(Array)和集合(Set)的區(qū)別是什么?


答案:


? 數(shù)組:有序,元素可重復(fù),通過索引訪問;


? 集合:無序,元素不可重復(fù)(需遵循Hashable協(xié)議),適合去重或快速查找。


12. 什么是枚舉(Enum)?


答案:枚舉是定義一組相關(guān)值的類型,可用于替代魔法數(shù)字或字符串,增強(qiáng)代碼可讀性。例如:

enum Direction {

? ? case north, south, east, west

}

13. 如何給枚舉添加原始值?


答案:定義枚舉時(shí)指定原始值類型,并為成員賦值。例如:

enum Weekday: String {

? ? case monday = "Mon"

? ? case tuesday = "Tue"

}

print(Weekday.monday.rawValue) // 輸出 "Mon"

14. 什么是初始化器(Initializer)?


答案:初始化器是類/結(jié)構(gòu)體創(chuàng)建實(shí)例時(shí)調(diào)用的方法,用于初始化所有存儲(chǔ)屬性。結(jié)構(gòu)體默認(rèn)生成“成員初始化器”,類需手動(dòng)實(shí)現(xiàn)。


15. 類的“指定初始化器”和“便利初始化器”有何區(qū)別?


答案:


? 指定初始化器(Designated Initializer):類的主要初始化器,必須初始化所有存儲(chǔ)屬性,用init定義;


? 便利初始化器(Convenience Initializer):輔助初始化器,必須調(diào)用同一類的指定初始化器,用convenience init定義。


16. 什么是可選鏈(Optional Chaining)?


答案:通過?.訪問可選類型的屬性/方法,若鏈中任意環(huán)節(jié)為nil,整個(gè)表達(dá)式結(jié)果為nil,避免嵌套可選綁定。例如:

let length = person?.address?.street?.count // 若任意環(huán)節(jié)為nil,結(jié)果為nil

17. nil合并運(yùn)算符(??)的作用是什么?


答案:如果可選類型有值,則解包并返回該值;如果為nil,則返回默認(rèn)值。例如:

let username = inputName ?? "Guest" // 若inputName為nil,用"Guest"

18. Swift中的String是值類型還是引用類型?


答案:String是值類型(本質(zhì)是結(jié)構(gòu)體),但Swift通過“寫時(shí)復(fù)制(Copy-on-Write)”優(yōu)化性能,避免不必要的復(fù)制。


19. 什么是擴(kuò)展(Extension)?


答案:擴(kuò)展用于在不修改原有代碼的情況下,為已有類型(如Int、String、自定義類)添加方法、計(jì)算屬性等。例如:

extension Int {

? ? func squared() -> Int { return self * self }

}

3.squared() // 結(jié)果為9

20. 如何判斷兩個(gè)引用類型實(shí)例是否指向同一對(duì)象?


答案:使用===運(yùn)算符(值相等用==)。例如:

let obj1 = Person()

let obj2 = obj1

print(obj1 === obj2) // 輸出 true

21. 字典(Dictionary)的鍵需要滿足什么條件?


答案:字典的鍵必須遵循Hashable協(xié)議,因?yàn)樽值渫ㄟ^哈希值快速查找鍵對(duì)應(yīng)的value。


22. 什么是閉包(Closure)?


答案:閉包是自包含的代碼塊,可捕獲和存儲(chǔ)外部變量,類似匿名函數(shù)。例如:

let add = { (a: Int, b: Int) -> Int in

? ? return a + b

}

add(2, 3) // 結(jié)果為5

23. 閉包的捕獲列表(Capture List)有什么用?


答案:指定閉包對(duì)外部變量的捕獲方式(如weak、unowned),用于避免循環(huán)引用。例如:

class Person {

? ? var name: String

? ? init(name: String) { self.name = name }

? ? lazy var printName: () -> Void = { [weak self] in

? ? ? ? print(self?.name ?? "nil")

? ? }

}

24. 用let定義的數(shù)組可以添加元素嗎?


答案:不能。let定義的數(shù)組是不可變數(shù)組(長(zhǎng)度和元素都不能修改);需用var定義可變數(shù)組才能添加/刪除元素。


25. 什么是計(jì)算屬性(Computed Property)?


答案:計(jì)算屬性不存儲(chǔ)值,而是通過getter(獲取值)和setter(設(shè)置值)計(jì)算值。例如:

struct Rectangle {

? ? var width: Double

? ? var height: Double

? ? var area: Double {

? ? ? ? get { return width * height }

? ? ? ? set { width = newValue / height }

? ? }

}

26. 存儲(chǔ)屬性(Stored Property)和計(jì)算屬性的區(qū)別?


答案:


? 存儲(chǔ)屬性:直接存儲(chǔ)值,占用內(nèi)存空間;


? 計(jì)算屬性:不存儲(chǔ)值,通過getter/setter計(jì)算,不占用內(nèi)存。


27. for-in循環(huán)可以遍歷哪些類型?


答案:可遍歷所有遵循Sequence協(xié)議的類型,如數(shù)組、集合、字典、范圍(1...5)、字符串等。


28. 如何將字符串轉(zhuǎn)換為整數(shù)?


答案:使用Int的初始化器,返回可選類型(轉(zhuǎn)換失敗為nil)。例如:

let num = Int("123") // 結(jié)果為Optional(123)

let invalidNum = Int("abc") // 結(jié)果為nil

29. 什么是范圍(Range)?


答案:范圍表示兩個(gè)值之間的區(qū)間,常見兩種:


? 閉區(qū)間(a...b):包含a和b(如1...5表示1、2、3、4、5);


? 半開區(qū)間(a..<b):包含a,不包含b(如1..<5表示1、2、3、4)。


30. Swift的訪問控制修飾符有哪些?


答案:從嚴(yán)格到寬松依次為:


? private:僅當(dāng)前作用域可見;


? fileprivate:當(dāng)前文件內(nèi)可見;


? internal:默認(rèn)修飾符,模塊內(nèi)可見;


? public:模塊外可訪問,但不可繼承/重寫;


? open:模塊外可訪問,且可繼承/重寫。


這些題目覆蓋了Swift基礎(chǔ)核心,適合快速梳理入門級(jí)知識(shí)點(diǎn),面試前可重點(diǎn)記憶。

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

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

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