寻求开发或查找可基于模板生成Swift文件的工具
这个需求太贴合日常iOS开发的痛点了——每次新建MVVM+DI风格的列表组件都要重复写一堆相似结构的文件,效率极低。下面从现有工具推荐和自定义开发思路两个方向给你解决方案:
一、直接用现有成熟工具
不需要从零开始造轮子,这些工具已经能满足你的核心需求:
Xcode自定义文件模板
Xcode本身就支持自定义模板,你可以把MVVM+DI的ViewController、ViewModel、Cell等模板打包成.xctemplate文件,放在~/Library/Developer/Xcode/Templates/File Templates/目录下。之后在Xcode里「新建文件」时,直接选择你的自定义模板,输入组件名称(比如PersonsList),就能自动生成所有对应命名的文件。
模板里用Xcode的占位符(比如___FILEBASENAME___)来替换名称,比如ViewController模板的类名可以写成___FILEBASENAME___ViewController,输入PersonsList后就会自动变成PersonsListViewController,还能预写好DI初始化、TableView基础配置这类固定代码。Sourcery
这是Swift生态里非常流行的代码生成工具,用Stencil模板语法来定义代码结构。你可以提前写好MVVM组件的模板文件,然后通过命令行传入组件名称、是否需要Cell等参数,就能批量生成全套文件。
它的优势是支持复杂逻辑,比如自动生成ViewModel协议的默认实现、DI注入的扩展方法,还能集成到Xcode的Run Script里,写完配置一键生成。SwiftGen
虽然它主要用来生成图片、字符串等资源的代码,但也支持扩展自定义模板。同样用Stencil语法,你可以定义业务组件的模板,快速生成符合你需求的MVVM+DI文件。
二、自定义命令行工具(完全定制化)
如果现有工具的灵活性满足不了你的特定规则(比如自定义的DI注入方式、Cell与ViewModel的绑定逻辑),可以自己写一个轻量的命令行工具:
- 设计输入方式:让用户通过命令行参数(比如
swift-template-generator --name PersonsList --with-cell --enable-di)或者简单的JSON配置文件,传入组件名称、是否需要Cell等需求。 - 准备模板文件:用Stencil这类轻量模板引擎,把每个文件的固定结构写好,比如:
ViewController.stencil示例:
同样为ViewModel、ViewModelProtocol、Cell、CellViewModel等文件准备对应的模板。import UIKit class {{componentName}}ViewController: UIViewController { private let viewModel: {{componentName}}ViewModelProtocol // 依赖注入初始化 init(viewModel: {{componentName}}ViewModelProtocol) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() setupTableView() bindViewModel() } private func setupTableView() { // 预写TableView基础配置 } private func bindViewModel() { // 预写ViewModel绑定逻辑 } } - 实现生成逻辑:读取用户输入的参数,替换模板中的占位符,然后把生成的内容写入到项目对应的目录下,自动创建所有需要的文件。
- 集成到Xcode:可以把这个工具做成Xcode的自定义菜单项,或者添加到项目的Run Script中,不用离开Xcode就能一键生成组件。
三、生成效果示例(以PersonsList为例)
当你输入组件名称PersonsList并指定需要Cell和DI时,工具应该自动生成以下文件:
PersonsListViewController.swift:带DI初始化、集成UITableView的ViewControllerPersonsListViewModel.swift:实现ViewModel协议的业务逻辑类PersonsListViewModelProtocol.swift:定义ViewModel接口的协议PersonCell.swift:自定义UITableViewCellPersonCellViewModel.swift:Cell对应的ViewModel类PersonCellViewModelProtocol.swift:CellViewModel的协议
每个文件的类名、协议名都自动替换为对应名称,并且预写好MVVM和DI的基础结构,你只需要填充业务逻辑即可。
内容的提问来源于stack exchange,提问作者Kamil Harasimowicz

