適合基礎(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)記憶。