Swift 面试题(一)

本文介绍了Swift语言的优势、常见设计模式、数据库选择及多种iOS开发中的实用技术,包括实时渲染设置、异步任务处理、错误对象使用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 如何设置实时渲染?
@IBDesignable让Interface Bulider在特定视图上执行实时渲染
复制代码
  1. 异步同步任务的区别?
`同步`:等待任务完成,一个接一个,顺可预测(Predictable Execution Order),通常情况在Main
`异步`:不分先后执行顺序完成任务,顺序不可预测(Unpredictable Order),通常在Background
复制代码
  1. 什么是NSError对象? NSError有三部分组成,分别为 Domain Code UserInfor Domain是一个字符串,标记一个错误域
NSError(domain: <#String#>, code: <#Int#>, userInfo: <#[String : Any]?#>)
复制代码
  1. 什么是Enum? enum 是一种类型,包含了相关的一组数据

  2. 为什么使用synchronized? 保证在一定时间内,只有一个线程访问它

  3. strong, weak,copy 有什么不同? strong:引用计数会增加 weak:不会增加引用计数 Copy: 意味着我们在创建对象时复制该对象的值

  4. 什么是ABI? 应用程序二进制接口

  5. 在Cocoa中有哪些常见的设计模式 创造性:单例(Singleton) 结构性: 适配器(Adapter) 行为:观察者(Observer)

  6. Realm数据库的好处 a. 开源的DB framework b. 快 c. ios 安卓都可以使用

  7. Swift 优势是什么? a. 类型安全 b. 闭包 c. 速度快

  8. 什么是泛型? 泛型可以让我们定义出灵活,且可重用的函数和类型,避免重复代码

  9. 解释 Swift 中的 lazy? lazy是 Swift 中的一个关键字,他可以延迟属性的初始化时间,知道用到这个属性时,才去加载它

  10. 解释什么是 defer? 延迟执行,当你离开当前代码块,就会去执行

  11. KVC 和 KCO 的区别? KVC: 它是一种用间接方式访问类的属性的机制 KVO: 它是一种观察者模式,被观察的对象如果有改变,观察者就会收到通知

  12. Gurad的好处? 可以使语句变得更简洁,避免嵌套很多层,可以使用break,return提前退出

### Swift 面试题及答案解析 1. **Swift 中的 `Optional` 类型是什么?它的作用是什么?** `Optional` 类型用于表示变量可以缺少值的情况。在 Objective-C 中,引用类型的变量可以通过 `nil` 表示缺少值,而基本数据类型如 `int` 或 `float` 无法表达这种状态。Swift 引入了 `Optional` 类型来统处理所有类型可能缺失值的情况,允许变量保存个具体的值或为 `nil`。这意味着无论是结构体、类还是基本类型都可以使用 `Optional` 来表示可选值[^2]。 2. **Swift 中什么时候使用结构体(struct),什么时候使用类(class)?** 结构体适用于需要复制而非共享的数据模型,例如简单的数据容器、数学运算对象等。它们默认是值类型,赋值时会进行深拷贝。类则适用于需要继承、多态和引用语义的场景,例如视图控制器、网络请求管理器等。类是引用类型,多个变量可以指向同个实例,适合需要共享状态的对象[^2]。 3. **Swift 中的 `didSet` 和 `willSet` 观察器有什么区别?** `willSet` 在属性值即将发生变化前被调用,可以获取新值但不能修改当前值。`didSet` 在属性值发生变化后被调用,可以访问旧值并执行相应的逻辑操作。这两种观察器通常用于监听属性变化并触发 UI 更新或其他副作用。 4. **如何在 Swift 中实现多线程操作?** 可以使用 `GCD`(Grand Central Dispatch)进行简单的异步任务调度,例如异步加载图片或执行后台计算。对于更复杂的任务依赖关系、优先级控制或取消操作,可以使用 `NSOperationQueue` 和 `NSOperation`,支持设置依赖关系、优先级和取消机制。例如: ```swift let queue = OperationQueue() let operation = BlockOperation { // 执行耗时任务 } queue.addOperation(operation) ``` 5. **Swift 中的 `Key-Value Observing`(KVO)是如何工作的?** KVO 是种基于运行时的消息转发机制,允许个对象观察另个对象的某个属性变化。要使用 KVO,必须确保类继承自 `NSObject` 并将属性标记为 `@objc dynamic`。当属性值发生变化时,系统会自动发送通知给观察者。例如: ```swift class Person: NSObject { @objc dynamic var name: String = "" } let person = Person() person.addObserver(self, forKeyPath: "name", options: .new, context: nil) override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "name" { print("Name changed to: \(change?[.newKey] ?? "")") } } ``` 6. **Swift 中的 `defer` 关键字有什么作用?** `defer` 用于定义段代码块,该代码块会在当前作用域退出时自动执行,无论是否发生异常。它常用于资源清理操作,例如关闭文件句柄、释放锁等。例如: ```swift func processFile() { let file = openFile() defer { closeFile(file) } // 处理文件内容 } ``` 7. **Swift 中的 `enum` 支持哪些高级特性?** Swift 的枚举不仅支持原始值(raw value),还支持关联值(associated value)。原始值是固定的常量值,例如字符串或整数;关联值则可以在枚举实例中携带额外信息。此外,枚举还可以拥有方法、计算属性和遵循协议。例如: ```swift enum Result<T> { case success(T) case failure(Error) func get() -> T? { switch self { case .success(let value): return value case .failure: return nil } } } ``` 8. **Swift 中的 `guard` 语句与 `if` 语句的区别是什么?** `guard` 语句用于提前退出函数或作用域,要求条件必须为真,否则执行 `else` 分支中的代码(通常是返回或抛出错误)。它有助于减少嵌套层级,使代码更清晰。`if` 语句则是传统的条件判断,不具备强制提前退出的功能。 9. **Swift 中的 `where` 子句可以用于哪些场景?** `where` 子句可以用于 `for` 循环、`if` 条件、`switch` 模式匹配以及泛型约束中。它可以添加额外的条件判断,过滤不符合条件的值。例如: ```swift let numbers = [1, 2, 3, 4, 5] for number in numbers where number % 2 == 0 { print(number) } ``` 10. **Swift 中的 `protocol` 支持哪些特性?** 协议可以定义方法、属性、下标和构造器接口,并且支持扩展默认实现。从 Swift 5 开始,协议还可以通过 `some Protocol` 返回任意符合该协议的具体类型。此外,协议还可以作为类型使用,例如存储在数组或字典中。 ```swift protocol Animal { func makeSound() } extension Animal { func makeSound() { print("Unknown sound") } } struct Dog: Animal { func makeSound() { print("Woof!") } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值