Swift中基于VIP架构创建Configurator的正确实现方式
VIP架构组件组装方案说明
SceneFactory + Configurator 组合的本质
这套组合只是Clean Swift(VIP)架构在工程落地时的可选依赖封装方案,绝非架构强制要求的通用标准实现。
这套写法的设计初衷是解决中大型项目里多页面跳转的依赖复用问题:
- 让Router不用在跳转逻辑里硬编码新页面的初始化、依赖注入代码,只需要调用SceneFactory的对应方法就能拿到组装完成的目标页面实例
- 统一收敛所有页面的初始化逻辑,避免不同入口初始化同一个页面时漏注入依赖的问题
它本身和VIP架构的核心规则没有任何绑定关系。VIP架构唯一的强制约束是分层职责边界和单向数据流: - View(ViewController):仅负责接收交互事件、转发给Interactor、渲染Presenter传回的UI数据
- Interactor:仅负责核心业务逻辑处理、调用Worker获取/处理数据、将业务结果传递给Presenter
- Presenter:仅负责将业务数据转换为UI可直接消费的格式、回传给View
- Router:仅负责页面跳转、跨页面参数传递
只要不违反以上边界、数据流保持单向,任何组件组装方式都符合架构规范。
你的轻量实现合规性判断
你在ViewController内通过configurator()方法直接初始化Worker、Interactor、Presenter、Router、视图组件的写法完全符合VIP架构要求。对于页面规模不大的项目、或者独立业务模块来说,这种写法比Factory+Configurator的方案代码量更少、调试路径更短,反而更实用。
照搬示例代码运行失败基本都是初始化顺序问题导致的:示例里SceneFactory和Configurator是循环持有关系,只要初始化时顺序不对、或者没有正确给SceneFactory的configurator属性赋值,就会出现空值崩溃、循环引用导致实例提前释放/内存泄漏的问题。这套封装本身为了支持通用跳转能力做了额外的耦合设计,小项目硬套反而徒增复杂度。
现有实现的优化建议
你的当前实现只需要调整两个细节就能稳定落地:
- 检查各层的引用修饰:Presenter对ViewController的持有必须用
weak声明,否则会形成VC→Interactor→Presenter→VC的循环引用,导致页面退出后内存无法释放 - 等后续页面数量增多后,可以把每个页面的组装逻辑从ViewController里抽离成单独的Assembler类,避免ViewController承担额外的依赖组装职责,保持View层的职责单一
额外提一句,你把UI搭建、布局逻辑抽成独立的HomeViewContollerViews类的做法非常好,比多数常规示例把所有UI代码堆在ViewController里的写法更易维护。
内容的提问来源于stack exchange,提问作者Ice
相关产品推荐
相关产品推荐

