1.分类和代理添加属性区别
代理添加属性:通常用于管理代理对象的状态或相关信息。代理本身是设计用于通信和事件传递的,不是用于存储数据。你可以在代理类中自由地添加属性,通常是用于管理和传递数据。
分类添加属性:分类不能直接添加存储属性,只能通过 关联对象 来实现模拟属性的效果。分类主要用于扩展已有类的功能,不改变类的本身实现
2.swift throw 和 rethrows区别
特性 throw rethrows
作用 用于函数内部抛出错误 用于函数接受闭包参数,且只有在闭包抛出错误时,才抛出错误
用法 需要 throws 关键字修饰函数,直接抛出错误 需要 rethrows 关键字修饰函数,只有闭包抛出错误时才会抛出错误
调用时机 调用者必须处理错误(使用 try 和 do-catch) 调用时,如果闭包没有抛出错误,就不需要处理错误
是否必须抛出错误 总是抛出错误 仅当传入的闭包抛出错误时才抛出错误
throw 是用于直接抛出错误的关键字。
rethrows 是一个特定的关键字,表示函数接受一个可能抛出错误的闭包,并且函数本身只有在闭包抛出错误时才会抛出错误。
3.swift Actor作用
actor 在 Swift 中的主要作用是 管理并发环境下的共享状态,通过串行化访问来确保数据的一致性和线程安全。它通过自动管理并发访问的排队机制,简化了并发编程中的错误处理,避免了手动管理锁等同步机制,尤其适用于需要保护共享状态的场景。
actor 用于并发编程,保证共享数据的线程安全。
访问 actor 内部数据需要通过异步方法,并使用 await 关键字。
actor 自动确保对其内部数据的串行访问,避免了传统并发编程中的竞态条件。
let counter = Counter()
// 创建多个并发任务
Task {
await counter.increment()
}
Task {
await counter.increment()
}
Task {
let value = await counter.getValue()
print("Final value: \(value)") // 输出 2
}
-
Swift 中,AssociatedType 和泛型(Generics) 区别
泛型:适用于函数、类、结构体等地方,允许你在编写代码时抽象出类型,使用时才指定具体类型。
关联类型:专门用于协议中,用来在协议中声明占位符类型,具体的类型会在实现协议时确定。
8d8efaf2-8fb9-4360-a112-d7a8482dcc67.png
5.CTMentor、URL-Block 和 Protocol-Class 组件化
1.CTMentor 是专为大规模 iOS 应用开发而设计的组件化框架,目标是提高开发过程中的模块化管理和自动化集成。它的主要特点包括:
自动化管理模块依赖:CTMentor 提供自动化的依赖管理,减少手动配置复杂度。
模块解耦:CTMentor 强调模块之间的最小依赖,通过清晰的接口和协议来解耦各个模块。
动态组件加载:它支持在运行时根据需要加载或卸载模块,有助于优化资源管理。
集成测试支持:它还提供了自动化测试功能,确保模块间的兼容性。
- URL-Block
URL-Block 是另一种组件化方式,通常用于网络请求和模块间的导航管理。它的设计思路是将应用中的 URL 请求封装为“URL-Block”形式,从而在不同的模块间共享资源。
通过 URL 处理请求:URL-Block 使用 URL 来标识各个模块的入口,通过动态路由跳转来进行模块间的访问。
模块间隔离:通过 URL 路由,模块之间相对独立,不直接依赖其他模块的实现。
简化跨模块通信:使用 URL 和 Block 作为通信桥梁,减少了各模块间的直接耦合。
- Protocol-Class
Protocol-Class 是通过协议和类来实现组件化的一种设计方式,主要侧重于通过协议来定义模块的接口,类则实现这些协议。
协议定义接口:通过协议定义模块之间的接口,使得模块实现与具体的类解耦。
类实现协议:具体的实现类会遵循协议的要求,完成模块的具体功能。
可插拔设计:因为协议定义了模块之间的接口,不同的类可以替换实现,保证了模块的灵活性和可扩展性。

6.RxSwfit
7.响应式和函数式区别
“函数式编程关注用纯函数和不可变数据来组合/变换数据,尽量把副作用隔离开,比如先算出 UI 需要的 state,再渲染到界面;响应式编程关注随时间变化的事件和异步数据,把它们建模成流,用 RxSwift/Combine 的订阅和操作符(debounce、merge、switchLatest 等)来持续驱动 UI 更新。”
8.OC和Swift混编问题
9.runtime反射
10.为什么oc是动态语言
11.OC对象可以为空吗,还是返回空
OC 里对象指针可以为 nil,给 nil 发消息不会 crash,会返回 0/nil/NO 这类默认值
12.inout 和 mutating 的区别
inout:让函数修改传入的参数变量(调用方加 &)。
mutating:让值类型的方法修改自身 self(struct/enum 专用)
13.Swift里的关键字
let / var:常量 vs 变量(能不能重新赋值)。
class / struct:引用类型 vs 值类型(拷贝语义不同)。
enum:枚举,可带关联值/原始值。
protocol:协议抽象;配合 extension 做默认实现。
extension:扩展类型能力(不能加存储属性)。
guard:提前返回,减少嵌套(条件不满足就退出)。
defer:作用域结束必执行(资源释放/收尾)。
optional(T?)/ nil:可能为空;用 if let/guard let 解包。
as / is:类型转换与类型判断。
inout:函数内可修改外部变量(调用处加 &)。
mutating:struct/enum 方法里允许修改 self。
throws / try / catch:错误抛出与捕获;try? 转 optional。
lazy:懒加载,首次使用才初始化。
weak / unowned:弱引用/无主引用,解决循环引用。
final:禁止继承/重写(也有利于优化)。
override:重写父类方法/属性。
@escaping:闭包逃逸(异步回调常见)。
@objc / dynamic:暴露给 ObjC runtime;KVO/swizzle 常用。
async / await:结构化并发的异步调用。
actor:并发安全的状态隔离(内部访问串行化,需要 await)。
14.SwiftLint怎么用
SwiftLint 是 Swift 的代码规范与静态分析工具,通过规则配置在编译前检查代码风格和常见问题,提升代码一致性和质量,减少 review 成本
15.oc问 反射 和 swift反射
区别主要在于动态能力强弱。OC 的 runtime 反射依赖 Objective-C runtime,可以获取类、属性、方法,还能动态添加方法、方法交换、消息转发和关联对象,所以它更像“运行时编程”;Swift 的反射主要是 Mirror,更偏向查看实例的属性和值,支持 struct、enum、class 等类型,但能力更弱,基本是只读的,主要用于调试和辅助工具,不会像 OC runtime 那样直接改运行时行为
16.combine
17.协议区别
OC 协议偏运行时动态接口,支持 optional,靠消息发送;Swift 协议是类型系统核心,支持默认实现、泛型约束、associatedtype/Self,既能给 class 用也能给 struct/enum 用,派发机制可静态优化;如果标记 @objc 才会退回 OC runtime,但会失去 associatedtype 等能力
18,block 闭包区别 { (x: Int) in ... }
Swift 的闭包和 OC 的 block 都是可传递的函数对象,用于回调。区别是 Swift closure 是语言一等公民,类型系统更强,并且有 @escaping 来区分是否会逃逸,捕获变量用 capture list(比如 [weak self])很直接;OC block 是对 C 的扩展,本质也是对象,修改外部变量常要 __block,避免循环引用通常用 weak/strong dance。两者都可能产生 retain cycle,需要注意捕获 self 的方式。”
二面:
1、问我架构 怎么搭建
2、埋点自己怎么实现
3、问了购物车逻辑,存数据库啊,几个存储方式应用场景,realm数据库,OC就是FMDB
4、tableView优化
