ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SwiftUI高频面试题全解析:从数据流到布局,吃透状态管理与新特性

SwiftUI高频面试题全解析:从数据流到布局,吃透状态管理与新特性 SwiftUI 这几年在 iOS 开发面试里的出场率越来越高但说句实话很多人准备得并不对路。我面试过不少候选人简历上写着“精通 SwiftUI”结果问到数据流怎么流转、视图怎么刷新回答就卡在“用 State 装饰一下”这种程度连 StateObject 和 ObservedObject 的区别都说不清楚。这篇内容就是冲着这个问题来的把真正高频的 SwiftUI 面试题按考点整理出来每道题都给了答案还额外标注了面试官为什么要问这题、踩坑点在哪里。不管你是准备跳槽、校招还是单纯想验证自己的 SwiftUI 水平这份整理都能帮你快速把知识体系补齐。我先把结论放前面SwiftUI 面试题翻来覆去就那么几类核心无非是三块——数据流与状态管理、布局与渲染机制、系统能力集成比如 UIKit 混编和生命周期。把这三块吃透再配合最新版本特性iOS 17、iOS 18 的变化你能应付九成以上的技术面。下面我按实战角度拆开讲。1. 面试考察维度拆解面试官到底想通过 SwiftUI 题看出什么很多候选人有个误解觉得 SwiftUI 面试就是背题把 State、Binding 这些关键词背全就能过关。实际上面试官问 SwiftUI 题背后考察的是三件事想清楚这个再准备效率完全不一样。1.1 第一层基本功是否扎实最基础的问题一定是状态管理因为这直接反映你写 SwiftUI 时是不是真的理解了这个框架的数据流机制还是仅仅照着教程抄。面试官常见套路是先问“ State 和 ObservedObject 有什么区别”然后顺着你的回答一路追问下去比如“什么情况下用 State 而不是 ObservedObject”“为什么 ObservedObject 要用 class 而不是 struct”。这种连环追问的目的就是测试你是真懂原理还是只会背结论。这里我多说一句很多人背答案只背到“State 是值类型ObservedObject 是引用类型”但面试官问一句“为什么值类型适合做状态引用类型适合做数据模型”很多人就卡住了。这其实牵扯到 Swift 值语义和引用语义的差异以及 SwiftUI 依赖追踪的实现方式。把这一层想明白比背十个题目管用。1.2 第二层有没有真实项目经验SwiftUI 纯语法题好背但面试官很快会把问题拉到你做过的项目里。比如他会问“你在这个页面里用了 NavigationStack碰到过什么坑吗”“你为什么把状态放到 EnvironmentObject 而不是直接传参”“你的列表页滚动卡顿是怎么排查的”这种题没有标准答案考察的是你有没有真的把 SwiftUI 用到生产环境。坦率地讲只写过 Demo 和真正做过项目的区别在这种问题上会暴露得很明显。Demo 项目通常数据量小、页面简单基本不会遇到性能问题和生命周期时序问题。而真实项目里你必然会遇到“页面消失了但网络请求还在回调”这类问题于是你就会主动去思考 onDisappear 和 task 的关系、怎么取消 Task、怎么处理 Observation 与 Combine 的并发切换。这些经验才是面试中值钱的部分。1.3 第三层对新技术方向的态度面试官也越来越爱问“iOS 17 的 Observable 你用过吗”“iOS 18 的 Entry 宏了解吗”这一层考察的不是语法记忆而是你有没有持续跟进 SwiftUI 的迭代节奏。SwiftUI 从 iOS 13 推出到现在变化非常大如果候选人还停留在几年前的知识说明平时基本不关注框架演进这对团队来说是个减分项。我在实际准备面试以及带人复盘时会把所有 SwiftUI 题目归成几个大块然后针对每一块都准备一个“考点地图”。下面这张表格就是我常用的分类方式你也可以按这个思路自己去整理。考察大项典型问题面试官真正想验证的能力数据流与状态管理State、Binding、StateObject、ObservedObject、EnvironmentObject 的区别与使用场景是否理解 SwiftUI 的响应式数据流设计布局与渲染布局三步骤、GeometryReader、ViewBuilder、some View是否理解 SwiftUI 声明式布局的底层逻辑生命周期与集成onAppear/onDisappear、scenePhase、UIKit 混编是否有真实项目集成经验新版本特性iOS 17 Observation、iOS 18 Entry是否有持续学习跟进的习惯性能优化列表卡顿、视图刷新过频、diff 机制是否具备排查线上问题的能力这张表你拿去对照自查基本能暴露你 SwiftUI 知识体系的短板在哪里。2. 数据流与状态管理SwiftUI 面试的灵魂考点数据流这块是 SwiftUI 面试的重中之重十道题里至少有五道围绕它展开。我先说一个整体理解SwiftUI 的核心是数据驱动视图也就是“数据一变视图自动更新”。所有 state 管理语法糖本质上都是在解决“数据变化怎么通知 SwiftUI 重新计算 body”这个问题。2.1 State、Binding、StateObject、ObservedObject、EnvironmentObject 的区别这是出现频率最高的一道题几乎所有面试都会问到。我的回答思路是先给结论再讲原理最后举例子。结论部分State 用于视图内部管理的值类型状态它的存储由 SwiftUI 管理当值变化时 SwiftUI 自动刷新依赖该状态的视图Binding 是对其他位置存储状态的引用允许子视图读写父视图持有的状态但它本身不持有数据StateObject 用于在视图生命周期内持有一个 ObservableObject 引用类型实例确保该实例只被创建一次ObservedObject 也是观察一个 ObservableObject但它不负责实例的生命周期实例往往由外部传入EnvironmentObject 则是从环境继承一个 ObservableObject适用于跨多层视图传递同一个实例省去逐层传参。原理部分我通常强调一个关键点State 背后是 SwiftUI 的 property wrapper 机制它把值类型的读写映射到 SwiftUI 内部的存储表中。如果你去看 SwiftUI 的接口定义你会发现 State 其实是一个结构体包装器它并不真正把数据存在你的视图里而是通过内部存储间接管理。这就是为什么文档建议 State 的访问尽量限定在视图内部别拿来当全局数据层用。示例部分我会现场画一个场景一个购物车页面购物车数据需要在商品列表页、购物车详情页、结算页共享。最简单粗暴的方案是在每个页面各自创建 State但那样数据不同步正确做法是把购物车模型做成一个 ObservableObject 类用 StateObject 在父层创建然后把同一个实例用 EnvironmentObject 注入环境子页面通过环境读取。这里面的坑是EnvironmentObject 如果环境里找不到对应实例运行时会直接崩所以注入的时机和层级一定要保证。2.2 为什么 ObservedObject 必须用 class而 State 用 struct 就行这个问题是前面的进阶追问我在面试里问过别人也被别人问过。核心答案在于 Swift 的值类型和引用类型的差异以及 ObservableObject 的实现机制。ObservableObject 这个协议里面有一个 objectWillChange 属性它是个 ObservableObjectPublisher本质是基于 Combine 发布事件。想让所有订阅者都能观察到同一个对象的变化这个对象必须是引用类型也就是说大家持有的是指向同一块内存的引用。如果用 struct每次修改都是产生一个新副本其他视图持有的还是旧副本数据自然就不同步了。而 State 对应的是值类型因为它管理的状态范围非常小就是当前视图内部。SwiftUI 会替你把这份值类型状态保存在视图层级对应的存储位置状态一改依赖它的所有视图都会重新求值。用值类型有一个额外好处可以精确控制依赖范围SwiftUI 能让某个 Text 只在绑定的那个值变化时才更新而其他无关视图不用重新渲染这对性能很重要。我在实际项目中踩过的一个坑是这样的早期把某个复杂页面里的筛选条件做成了 class ObservableObject每次筛选条件轻微变化objectWillChange 都会发出事件导致页面里所有涉及筛选结果的视图全部刷新列表体验明显卡顿。后来改成把筛选条件拆成几个独立的 State 值类型属性SwiftUI 自动只刷新受影响的部分流畅度立刻上来了。所以这两者不只是“形式区别”背后还有“刷新粒度”的差异。2.3 iOS 17 Observation 框架Observable 是面试加分项如果你面试的时候提到 iOS 17 的 Observable面试官通常会眼睛一亮因为这说明你有在跟进新版本。这个考点快速升温的原因是 Apple 在 iOS 17 里引入了一套新的 Observation 框架并且在 WWDC 上明确建议开发者逐步从 ObservableObject 迁移到 Observable。说一下它和旧方案的本质区别ObservableObject 需要手动加 Published 来标记需要观察的属性而 Observable 默认观察宏里所有被读取的属性。这意味着你不再需要纠结“这个属性要不要发布”视图在你访问属性的时候自动建立依赖属性变化后只刷新真正读了这个属性的视图。粒度比后面要细得多。常见追问是“你实际迁移过吗遇到过什么问题”。我的真实体验是迁移本身不难就是把ObservableObject协议去掉把Published去掉类上打Observable视图里把StateObject改成State。但有个细节特别容易踩坑——当这个 Observable 对象里的属性需要响应异步请求结果时会比较绕因为 Observation 框架对“哪个线程发生了变化”要求比较严格如果修改不在合理时机发起SwiftUI 可能收不到更新或会有卡顿。我的建议是能用 main actor 更新 UI 数据就在 main actor 更新别在全局并发里随便改动被观察的数据。2.4 状态管理题的固定追问套路与应对这部分内容可能考试不会直接考但面试一定会问。面试官围绕状态管理喜欢追着问三类问题一是“你的状态放在哪一层”二是“多个视图需要共享状态时你怎么办”三是“你的状态更新频繁怎么优化刷新性能”你可以提前准备一套体系来解释。我的回答框架一般是这样的首先明确状态的归属原则——单个视图私有的状态放 State父子视图需要共享的用 Binding跨越多层且需要共享的用 EnvironmentObject 或 Observable 注入需要持久化的数据单独走持久化层不直接塞进视图状态里。然后当多个视图共享同一个状态时不要复制状态到每个视图要把共享实例放在源头的拥有者里比如 App 层或页面容器层子视图只负责读和通过回调或 Binding 修改。最后性能优化方面我会主动提一下 SwiftUI 的依赖追踪机制避免把过大的模型一次性注入环境而是按页面职能拆分状态减少无关联刷新。如果你能把这个回答体系讲清楚面试官基本能判断你是真的在工程里用 SwiftUI 写过东西不是背题。3. 布局与渲染机制从“会写”到“理解 SwiftUI 在干什么”布局这块是 SwiftUI 面试的第二个重头戏。很多候选人的状态是“写界面没问题但被问到底层布局流程就发懵”。我建议每个用 SwiftUI 的人都把布局三步骤理解透因为这不只对面试有用对你日常开发提升效率的帮助也巨大。3.1 SwiftUI 布局三步骤propose、choose、placeSwiftUI 的布局流程可以概括为三步父视图向子视图提出一个建议尺寸propose子视图根据自身内容在这个建议尺寸里选择自己的尺寸choose父视图将子视图放置到最终的位置place。这个流程和我们熟悉的 UIKit Auto Layout 有本质区别UIKit 约束系统是求解一个满足所有约束的最终 frame而 SwiftUI 是自底向上、自顶向下结合的一个协商过程。面试里常考的一个点是“为什么 Text 在没有明确宽度限制时宽度刚好是内容的宽度”用三步走就能解释父视图给了它一个很宽松的建议尺寸或者 nilText 在 measure 自己的内容后选择了刚好能容纳文字的尺寸父视图再把它放好。如果父视图给的建议尺寸是固定的比如用 .frame(width: 100) 强约束那么 Text 会在这个宽度内换行这就是 frame 修饰符改变了 propose 阶段的行为。我建议你在准备面试时能亲手写一个小 Demo 验证这个流程放一个 Text 在里面外层加 frame 加 background修改 frame 条件观察文本换行位置和背景颜色的变化。做完你就明白 frame 的作用点其实在布局协商阶段而不是简单的“设置宽高”。3.2 NavigationStack 和 NavigationView 的差异iOS 16 之后 NavigationStack 成为主流面试官也会对比着问NavigationStack 和 NavigationView 有什么区别这个问题表面上是问 API 更新但实际问你对导航体系工作原理的理解。NavigationStack 的核心是一个基于路径path驱动导航的容器你可以把导航状态建模成一个数组每个元素对应一个 push 的页面。好处是可预测、可编程管理比如你可以直接从路径中删除中间的某个页面或者通过绑定 path 实现返回多级页面的逻辑。NavigationView 是旧的声明式导航容器导航状态隐藏在内部难以精准控制且 iOS 16 之后 Apple 基本把重点放在 NavigationStack 上。面试加分答法如果需要“动态路由”或者“深链接跳转到某个层级页面”你会选择 NavigationStack 加 path因为你可以通过修改 path 数组直接控制整个导航栈的状态比如清空、覆盖、跳多级这在旧方案里是逻辑很绕的事情。同时你可以补充 NavigationStack 还支持通过 navigationDestination 将数据模型和目的视图做绑定这让“推送一个模型对应一个视图”变得非常自然。3.3 ViewBuilder 和 some ViewSwiftUI 语法糖背后的两个关键词面试题里如果出现“解释一下 some View”估计不少人只能回答“表示不透明返回类型”。但这不够面试官想听的是为什么 SwiftUI 要用 some View 而不是直接返回具体类型以及 ViewBuilder 在这个体系里承担什么角色。要回答这个问题你先要理解 View 是一个协议它有一个关联类型 Body。如果每个 View 都返回具体的 Body 类型那么一旦视图结构发生变化整个类型系统就会跟着变。SwiftUI 用some View让编译器替我们推断并隐藏这个具体类型对外只暴露一个稳定的抽象层。这就是 Swift 5.1 引入 Opaque Return Type 的意义——调用者不需要知道内部具体类型是什么只知道自己拿到的东西遵循 View 协议。而 ViewBuilder 是另一个视角它让你在一个闭包里写多个视图而不需要手动组合。实际上 ViewBuilder 内部是通过一系列 buildBlock 函数把闭包里的多个视图组合成 TupleView。你可以把它理解为“DSL 编译器”普通代码里一个闭包只能有一个返回值但 ViewBuilder 改写语法让闭包里的每个视图都变成组合结果的一部分。这也是为什么 SwiftUI 的视图闭包里不能用含 return 的复杂逻辑写出一串视图只能靠 ViewBuilder 支持的条件语句和有限的语法。如果你还想再深一层可以补充正是因为 ViewBuilder 基于 Result Builders 机制它和 Swift 宏Macro关系也很密切比如 iOS 18 的Entry就是利用同类机制做扩展。把这个体系讲通面试官会明显把你和只会写 UI 的候选人区分开。3.4 布局性能优化equatable、identity 与视图更新布局性能也是常考的点尤其是列表页。SwiftUI 对视图的重建基于一个 diff 机制它会比较新旧 View 的结构然后只更新变化的部分。如果你希望某个视图在数据没变化时不重新计算 body可以用 Equatable 协议加上.equatable()修饰符这样每次更新前会先比较数据是否相等相等就跳过 body 重算。这里有个误区很多人以为加.equatable()一定更高效其实如果相等判断本身很昂贵反而可能更慢。真正的优化思路是尽量缩小 data 的影响范围比如用更精细的 Binding 而不是传递整个大模型。另一个和性能相关的高频考点是“为什么列表滚动卡顿”。这背后除了视图刷新优化外还有一个 identity 问题。SwiftUI 通过ForEach的 id 来判断列表项的增删改如果 id 不稳定或不唯一列表会错误地重建视图导致性能急剧下降。面试里遇到“你的列表卡顿怎么排查”这种题你要答出这个链条先看 id 是否稳定再看 row 子视图是否因为父级状态变化全部重建再看有没有在 body 里执行重型任务比如大量图片加载或磁盘 IO。逐层排查基本都能定位到问题。4. 生命周期、系统集成与工程化SwiftUI 面试里最拉分的实战题数据流和布局属于“纸面功夫多”的板块但面试官很快会把问题引向“你在真实项目里怎么落地”。这一节的题目答得好不好直接决定你面试的上限。4.1 SwiftUI 的生命周期问题onAppear、task、onDisappear 的时序SwiftUI 的生命周期和 UIKit 完全不同没有 viewDidLoad、viewWillAppear 这种一眼就懂的阶段。SwiftUI 里常用的是 onAppear、onDisappear 和 task。这里面试官经常埋一个坑onAppear 不是每次进入页面都会触发它在视图出现在窗口时触发但如果一个视图被其他视图覆盖后再次出现可能不会再次触发因为视图本身没有被销毁重建。真正区分是否销毁的是 identity 和生命周期。我在项目里遇到的一个典型问题页面从 A push 到 B再返回 A发现 A 的 onAppear 的频率、task 的启动时机和你预期不一样。排查后发现SwiftUI 的导航栈会保留 A 的视图实例pop 回来时不一定重新创建视图也不一定重新触发 onAppear这取决于是否配合了新的 Navigation 语义。所以如果你依赖“回到页面就要重新拉数据”最好别再死等 onAppear而要考虑使用 scenePhase 结合页面的激活状态或在 model 层显式监听数据源的更新来驱动刷新。另外一个高频追问task 和 onAppear 的区别。task 的好处是可以绑定一个异步操作和视图生命周期视图消失时自动取消任务。这是 SwiftUI 里做网络请求的推荐姿势因为如果你手动在 onAppear 里启动一个 Task视图消失时这个任务不会自动取消很可能造成无谓的请求和状态更新。面试时你可以主动说我一般用.task修饰符管理网络请求因为它能在视图消失时取消任务避免内存泄漏和回调过期。这一句话能同时体现你对流行写法和内存管理的理解。4.2 UIKit 与 SwiftUI 混编UIViewRepresentable 的核心考点SwiftUI 已经出了好几年但真实项目里仍然有很多遗留 UIKit 代码所以混编题目几乎必考。最常见的是 “怎么把 UIView 包装进 SwiftUI”答案是利用 UIViewRepresentable。考察点包括makeUIView 负责创建实例updateUIView 负责同步状态这两个方法的职责边界要清晰另外 Coordinator 用来处理 UIKit 的 delegate 回调因为 SwiftUI 是声明式的需要把 UIKit 的事件转换成可以驱动 SwiftUI 状态的消息dismantleUIView 负责清理但实际项目中很少用到面试官问到你只要知道它存在即可。我通常建议候选人准备一个真实的例子把 WKWebView 封装到 SwiftUI 里。这个例子很经典因为 WKWebView 有 delegate、有导航状态、有 JS 回调几乎会把 UIViewRepresentable 里所有常用能力覆盖到。你能把 WKWebView 封装讲清楚混编题目基本就稳了。4.3 ObservableObject 与 Combine 的关系以及异步更新的坑虽然 iOS 17 用 Observable 迁移是趋势但现存项目中 ObservableObject 还是大量存在Combine 考题也不会消失。面试官惯用的问法是“你的 Published 属性在后台线程更新后 UI 会不会正常刷新”答案是不一定。Published 是个 Publisher它会在值变化时发出事件但如果你在后台线程修改SwiftUI 收到的更新如果没切回主线程就可能触发运行时问题或界面不更新。我实际踩过的坑是把一个网络请求库的回调放在后台线程直接操作数据模型里的 Published 属性结果界面偶尔更新偶尔不更新控制台还会蹦出“Publishing changes from within background threads is not allowed”的警告。修复方式很简单在修改属性前用Task { MainActor in ... }或者.receive(on: RunLoop.main)确保主线程更新。你准备面试时把这个坑讲出来比干巴巴背 Combine 操作符有价值得多。4.4 工程化话题模块化、组件化、可测试性资深岗位面试一定会聊到工程化。SwiftUI 项目的组件化思路和 UIKit 不同声明式 UI 天然更适合把组件拆成“数据输入 视图输出”的模式。面试官可能会问“你的页面上有好多子组件状态互相影响你怎么设计”这时候你要答出组件边界意识每个子组件最好只依赖自己需要的输入避免从顶层传一个超大对象进来。可测试性也是加分项SwiftUI 的视图层测试比较薄弱但你可以在 model 层把业务逻辑抽出来用单元测试覆盖。我在项目里的做法是把网络请求、数据转换、状态管理都从 View 里拆出去View 只做简单的绑定。这样 UI 即使很难写自动化测试核心逻辑仍然能被单测保护。面试官听到这种实践至少能确认你具备工程思维而不只是会摆控件。4.5 iOS 18 的新特性会怎么考Entry、宏、跨设备适配最后提一下新版本特性。iOS 18 中比较有代表性的 SwiftUI 变化是引入Entry宏用来在 SwiftUI 环境中注册自定义值。它让“向 Environment 注入自定义类型”变得非常轻量。之前我们要自定义 EnvironmentKey 并且手动实现 static var defaultValue 和 static let key模板代码很多。现在用一个宏就可以搞定代码可读性也更强。面试时如果被问到这种题不要只背语法要说出“它解决什么问题”自定义环境值在组件库里特别有用比如你的设计系统里需要一个 主题配色对象用 Entry 注入到 Environment 后所有子视图可以像读 Environment(.customColor) 一样拿到。能把这个思维讲出来表明你不是跟着新闻走而是真的在用新技术。还有一点容易被忽略的是跨平台能力。SwiftUI 可以用来开发 iOS、macOS、watchOS、tvOS甚至 visionOS。面试官有时会问“你怎么做多平台适配”。这时候你要强调不要为了适配把所有平台都堆在一个文件里要善用条件编译和平台差异性组件封装把核心业务逻辑独立出来。如果回答得好你甚至能把话题引导到自己对 Apple 生态的理解上这是非常自然的加分方式。5. 高频面试题速查表考前 30 分钟背完这套框架整理到最后的这一份速查表是我实际用来给团队小伙伴做面试突击的素材。我把它压缩到最核心的问题你不用全文背诵关键是拿到每个问题后思考一下如果面试官顺着这个问题追问你能不能接住。题目核心考点答题要点常见追问State 和 StateObject 的区别值类型/引用类型、生命周期State 用于值类型视图内部状态StateObject 持有 ObservableObject 实例保证只创建一次StateObject 的生命周期由谁管理ObservedObject 和 StateObject 的区别实例所有权StateObject 负责创建并持有实例ObservedObject 只观察外部传入实例会不会重复初始化Binding 的作用双向绑定子视图读写父视图持有的状态绑定不拥有数据什么时候该用 BindingEnvironmentObject 的作用与隐患环境注入从环境中读取共享 ObservableObject层级深时方便注入缺失会崩溃如何避免ObservableObject 和 Published发布订阅属性变化时发出事件驱动依赖视图刷新后台线程更新的风险iOS 17 Observable新 Observation 框架宏自动追踪属性依赖更细粒度刷新和 ObservableObject 对比布局三步骤propose/choose/place父子视图协商尺寸位置frame 会改哪个阶段some View不透明返回类型隐藏具体类型稳定接口为什么不用具体类型ViewBuilderResult Builder闭包里组合多个视图为什么闭包语法受限NavigationStack路径驱动导航path 数组管理导航栈深链接跳多级页面方案onAppear 与 task生命周期task 可自动取消异步操作页面被覆盖后触发情况UIKit 混编UIViewRepresentablemake/update/Coordinator 职责WKWebView 封装细节列表卡顿排查id 稳定性、依赖追踪检查 id 和刷新范围Equatable 是否一定高效我给你的建议是这张表不要死记硬背最好能对照着自己手写一个小项目把表格里的每个点都在代码里跑一遍。比如建一个 Todo App把数据用 Observable 重写一次再用旧 ObservableObject 写一遍你立刻能体会差距在哪里。6. 关于准备策略的个人经验面试题不是用来背的是用来建立体系的这篇内容最后我讲点准备策略层面的东西。我见过太多人把面试题当成“死记硬背”的材料背熟了 State、Binding、ObservedObject 的定义被追问两句就露馅。真正的准备方式应该是拿这些高频题当目录去建立自己的 SwiftUI 知识体系。我的经验是分三步走第一步先花一天时间把 SwiftUI 的状态管理全链路写清楚从 property wrapper 原理到 ObservableObject 再到 Observation 框架每一步都配合代码验证第二步把布局机制、导航机制、生命周期机制这些核心概念默写成一张思维导图不用完全准确但要能闭着眼把流程说出来第三步选定一个自己熟悉的真实项目用 SwiftUI 重写一遍核心模块重写过程中记录遇到的问题这些问题就是你面试最好的素材。准备面试还有一个容易忽略的细节表达方式。同样一个问题你说“用 State 就行”和“这里我用 State 管理视图内部的值类型状态因为它的值变化时 SwiftUI 能精准刷新依赖它的视图同时避免引入不必要的引用类型共享”给面试官留下的印象是截然不同的。所以准备答案时不要只准备“点”要准备“结论 原因 例子 踩坑”的完整表达。这样即使面试官换了角度追问你也能从自己的知识体系里找到支点而不是卡壳在那里。根据我自己的面试经验诚实地承认“这个我还没实践过但我理解它的原理是……”比硬撑着嘴硬要好太多。面试官要的从来不是一个什么都做过的人而是一个知道自己边界、学习能力又在线的人。所以数据流、布局、生命周期、新特性这几大块你能讲清楚其中 80%再坦诚面对剩下的 20% 缺口反而更容易拿到正向评价。
返回列表