二、Swift 基础
1. struct
vs class
struct
和class
的核心区别(值类型 vs 引用类型、内存管理、继承等)?struct
自动生成init
,class
必须手动初始化?mutating
关键字的作用?final
关键字的作用?
2. Optional
Optional
的本质是什么?(enum
:.none
和.some(Wrapped)
)??
、if let
、guard let
、optional chaining
的区别?@unwrapped
和隐式解包(String!
)的区别?
3. 协议 & 泛型
Protocol
的associatedtype
是什么?如何约束?where
子句在泛型中的作用?Self
和self
的区别?
4. 闭包
- 逃逸闭包(
@escaping
)和非逃逸闭包的区别? [weak self]
和[unowned self]
的区别?lazy var
+ 闭包初始化?
5. 多线程(Swift)
- GCD 在 Swift 中的使用(
DispatchQueue
、DispatchGroup
)? async/await
和Task
的使用?@MainActor
的作用?
6. Codable
class
可以遵守Codable
吗?如何实现?- 如何用
CodingKeys
映射 JSON 字段? - 如何处理接口返回的
Int
/String
兼容问题?
7. 内存管理(Swift)
weak
、unowned
、strong
的区别?- 循环引用在 Swift 中的常见场景及解决方案?
deinit
的作用?
8. 响应式编程
- Combine 的核心组件(
Publisher
、Subscriber
、Subject
)? - RxSwift 的常见操作符(
map
、filter
、flatMap
)? Observable
和Future
的区别?Swift
struct 和 class 的区别?
- struct、class 初始化时属性/init 的注意事项?
- class 是否可以服从 Codable 协议?
- 如何利用 Codable 协议兼容接口字段名和类型?
- Optional 的本质是什么?
- Swift 是值语义还是引用语义?
- 什么是 mutating 关键字?
enum 的高级用法有哪些?关联值、递归枚举?
Swift async/await
Swift 中如何使用 async/await 实现并发任务?
- async let 和 TaskGroup 的区别与使用场景?
- actor 是什么?如何解决数据竞争?
七、常用框架
Combine
- Combine 的核心概念(Publisher/Subscriber/Operator)?
- @Published 和 ObservableObject 有什么区别?
- 如何取消订阅?AnyCancellable?
RxSwift
- 什么是 Observable?Observer?
- 如何使用 Subjects?(Publish/Behavior/Replay/Async)
- DisposeBag 有什么用?
- RxSwift 与 Combine 有哪些异同?
八、高阶 Swift 语法
- 泛型如何定义?如何约束?
- 如何实现一个泛型缓存类?
- Protocol 和 associatedtype 的高级用法?
- Swift 的闭包语法和使用?
- 什么是逃逸闭包(@escaping)?
- 高阶函数:map/filter/reduce/flatMap/compactMap 的用法?
- 如何使用 Swift 的 Result 类型处理异步任务?
1. Swift 高阶特性
泛型与协议
- 如何设计一个支持泛型缓存的
Repository
模式? associatedtype
与some
、any
关键字的区别?Swift 5.7 的不透明类型优化了什么?- 为什么
Protocol
不能直接作为类型使用?如何用类型擦除(Type Erasure)解决?
- 如何设计一个支持泛型缓存的
内存管理
- Swift 的
unowned
和weak
在底层是如何实现的?何时会导致野指针? withUnsafeBytes
和withMemoryRebound
的使用场景?如何安全操作指针?
- Swift 的
并发模型
actor
的隔离机制如何实现?与@MainActor
的线程调度差异?Sendable
协议的作用?如何让自定义类型支持跨线程传递?
六、实战编码题
实现线程安全的 LRU 缓存
final class LRUCache<Key: Hashable, Value> {
private let lock = NSLock()
private let capacity: Int
private var cache: [Key: Value] = [:]
private var order: [Key] = []
init(capacity: Int) { self.capacity = capacity }
func get(_ key: Key) -> Value? {
lock.lock()
defer { lock.unlock() }
guard let value = cache[key] else { return nil }
order.removeAll { $0 == key }
order.append(key)
return value
}
func set(_ key: Key, value: Value) {
lock.lock()
defer { lock.unlock() }
if cache[key] == nil && cache.count >= capacity {
let removedKey = order.removeFirst()
cache[removedKey] = nil
}
cache[key] = value
order.append(key)
}
}基于 Combine 实现防抖搜索
import Combine
class SearchViewModel {
var query: String = ""
private var cancellables = Set<AnyCancellable>()
init() {
$query
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.removeDuplicates()
.sink { [weak self] query in
self?.performSearch(query: query)
}
.store(in: &cancellables)
}
private func performSearch(query: String) {
print("Searching for: \(query)")
}
}
十、Swift 进阶机制
- Property Wrapper 的原理和常见用法(@State、@Published、@UserDefault 等)?
- Swift 的访问控制(open、public、internal、fileprivate、private)有哪些场景?
- Swift 的模块化开发方式?如何拆分模块?
- 如何实现依赖注入(DI)?有无使用框架(如 Resolver、Swinject)?