ARTICLE DETAIL

资讯详情

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

Natalie实战教程:如何从零生成第一个类型安全的Storyboards.swift文件

Natalie实战教程:如何从零生成第一个类型安全的Storyboards.swift文件 Natalie实战教程如何从零生成第一个类型安全的Storyboards.swift文件【免费下载链接】NatalieNatalie - Storyboard Code Generator (for Swift)项目地址: https://gitcode.com/gh_mirrors/na/Natalie在Swift开发中你是否曾因performSegue(withIdentifier: xxx)里的字符串写错而崩溃到怀疑人生Natalie 正是一款为解决此痛点而生的Storyboard代码生成器它自动解析你的.storyboard文件为你生成类型安全的Storyboards.swift代码把 Segue、复用 Cell、Storyboard 名称全部变成编译器可检查的 Swift 类型。本教程将带你从安装开始一步步生成属于自己的第一个类型安全的Storyboards.swift文件并把它接入日常开发流程。Natalie 是什么为什么你需要一个 Storyboard 代码生成器传统的 Storyboard 开发依赖大量硬编码字符串例如Main、ScreenOneSegue、MyCell。这些标识符一旦拼写错误或重命名编译器无法帮你发现只能在运行时崩溃。Natalie 用 Swift 编写通过内置的 SWXMLHash 库解析 Storyboard 的 XML 结构见 SWXMLHash.swift再按一套模板生成 Swift 扩展代码。核心处理逻辑集中在 Natalie.swift入口则在 main.swift读取参数 → 扫描 storyboard → 输出代码到标准输出。Natalie 核心功能速览功能作用典型生成产物Storyboards 枚举替代手写UIStoryboard(name:)Storyboards.Main.storyboardSegue 类型安全消灭 Segue 字符串标识符MainViewController.Segue.screenOneSegueReusable 复用类型安全地复用 CellScreenTwoViewController.Reusable.MyCell颜色资源自动生成命名颜色UIColor.Screen1iOS 11多平台支持一套逻辑适配多端iOS / macOS / tvOS 自动分平台生成第一步3 种方式快速安装 NatalieNatalie 是一个命令行工具安装方式非常灵活任选其一即可。方式一Swift Package Manager 源码构建 ⭐ 推荐$ git clone https://gitcode.com/gh_mirrors/na/Natalie $ cd Natalie $ ./scripts/build.sh构建产物会出现在./Natalie/natalie。想全局使用把它复制到/usr/local/bin即可$ cp natalie /usr/local/bin方式二Homebrew 一键安装如果你使用 macOS一条命令搞定$ brew install natalie方式三把二进制放进项目仓库直接把natalie可执行文件放在项目根目录并纳入版本控制这样团队所有人和 CI 都能用同一版本生成代码保证产物一致性。第二步一条命令生成第一个 Storyboards.swiftNatalie 的使用极其简单它只接受两类参数✅ 单个.storyboard文件的路径✅ 一个文件夹路径会递归扫描其中所有 storyboard# 方式A指定单个 storyboard 文件 $ natalie NatalieExample/NatalieExample/Base.lproj/Main.storyboard NatalieExample/NatalieExample/Storyboards.swift # 方式B传入整个目录自动处理所有 storyboard $ natalie NatalieExample/NatalieExample NatalieExample/NatalieExample/Storyboards.swift命令输出会通过标准输出重定向到目标文件。扫描与递归查找的逻辑在 Helpers.swift 的findStoryboards(rootPath:suffix:)中实现传入目录即可自动收集全部 storyboard。第三步认识生成的 Storyboards.swift 长什么样生成的文件结构清晰你可以直接参考官方示例 Storyboards.swift。最核心的部分如下struct Storyboards { struct Main: Storyboard { static let identifier Main static var storyboard: UIStoryboard { return UIStoryboard(name: self.identifier, bundle: nil) } static func instantiateMainViewController() - NatalieExample.MainViewController { return self.storyboard.instantiateViewController( withIdentifier: MainViewController) as! NatalieExample.MainViewController } } }而每个 ViewController 都会被扩展出类型安全的 Segue 枚举extension MainViewController { enum Segue: String, CustomStringConvertible, SegueProtocol { case screenOneSegueButton Screen One Segue Button case screenOneSegue ScreenOneSegue var destination: UIViewController.Type? { switch self { case .screenOneSegue: return ScreenOneViewController.self ... } } } }平台相关的差异如 iOS 用UIStoryboard、macOS 用NSStoryboard由 OS.swift 统一管理跨平台项目也能一次生成、各端适配。第四步在业务代码中优雅使用生成结果 告别字符串 Segue生成前你要写脆弱的字符串生成后直接使用类型安全枚举。官方示例 MainViewController.swift 展示了两大核心用法// 跳转编译器会检查枚举是否存在 self.perform(segue: MainViewController.Segue.screenOneSegue) // 回调直接比较 Segue 类型不再怕拼错 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue MainViewController.Segue.screenOneSegue, let vc segue.destination as? ScreenOneViewController { vc.view.backgroundColor .orange } } 类型安全地复用 Cell表格与集合视图的复用标识符同样被类型化了tableView.registerReusableCell(MainViewController.Reusable.MyCell) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) - UITableViewCell { let cell tableView.dequeueReusableCell( ScreenTwoViewController.Reusable.MyCell, for: indexPath) ... } 自动生成的命名颜色如果你的 storyboard 中使用了 Asset Catalog 命名颜色如项目里的 Screen1.colorsetNatalie 会生成extension UIColor { static let Screen1 UIColor(named: Screen1) static let Screen2 UIColor(named: Screen2) }第五步进阶技巧——集成 Xcode 每次构建自动生成手动运行命令毕竟麻烦更专业的做法是把 Natalie 挂进 Xcode 的Build Phases每次编译前自动检查并重新生成Storyboards.swift选中工程 Target → 进入Build Phases选项卡点击左上角→New Run Script Phase⚠️ 关键把该阶段拖动到Compile Sources 之前确保编译时文件已是最新粘贴如下脚本需把NATALIE_PATH改成你的二进制实际路径NATALIE_PATH/usr/local/bin/natalie if [ -f $NATALIE_PATH ]; then BASE_PATH$PROJECT_DIR/$PROJECT_NAME OUTPUT_PATH$BASE_PATH/Storyboards.swift # 仅当 storyboard 比生成文件新时才重新生成 if [ ! -e $OUTPUT_PATH ] || [ -n $(find $BASE_PATH -type f -name *.storyboard -newer $OUTPUT_PATH -print -quit) ]; then $NATALIE_PATH $BASE_PATH $OUTPUT_PATH echo Natalie Generator: Storyboards.swift 已重新生成 fi else echo error: 找不到 natalie请先安装 exit 1 fi最后把生成的Storyboards.swift加入工程即可。从此改完 Storyboard编译一次类型安全的代码自动更新。常见问题 FAQQ传入文件还是目录A都可以。传文件只处理该文件传目录会递归处理目录下所有.storyboard更推荐。Q生成的代码支持哪些平台AiOS、macOS、tvOS 全支持Natalie 会自动根据 storyboard 的targetRuntime属性生成对应平台的代码。QStoryboard 里的控制器属于自定义 Framework 怎么办ANatalie 会自动检测自定义模块并生成对应的import语句框架内的控制器同样能被类型安全地实例化。Q如何保证生成文件不被误改A可在 Xcode 脚本中用chflags uchg给生成文件加锁storyboard 更新时脚本会解锁并重新生成官方脚本思路可参考 README.md。写在最后从字符串地狱到类型安全Natalie 用一次代码生成换来了长期的心智负担清零Segue 拼错、Storyboard 名写错、Cell 复用 ID 改漏这些运行时崩溃全部变成编译期报错。整个工具链由 Package.swift 组织测试样例见 ParserTest.swift想深入源码的同学可以直接阅读。现在就克隆项目、跑一次生成命令亲眼看看你的Storyboards.swift长什么样吧如果想让生成更自动化别忘了把 Run Script 阶段配好让 Xcode 替你打工。【免费下载链接】NatalieNatalie - Storyboard Code Generator (for Swift)项目地址: https://gitcode.com/gh_mirrors/na/Natalie创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表