Natalie多平台实战:一份代码搞定iOS、macOS与tvOS三端Storyboard生成 Natalie多平台实战一份代码搞定iOS、macOS与tvOS三端Storyboard生成【免费下载链接】NatalieNatalie - Storyboard Code Generator (for Swift)项目地址: https://gitcode.com/gh_mirrors/na/Natalie在Swift开发中Storyboard代码生成器Natalie是解决字符串标识符地狱的利器。本文带你实战 Natalie 多平台用法只用一条命令、一份源码即可同时为 iOS、macOS 与 tvOS 生成类型安全的 Storyboard 代码彻底告别手写 Segue 标识符的脆弱代码。一、Natalie 是什么它解决了什么痛点Natalie 是一款用 Swift 编写的Storyboard 代码生成器。它读取.storyboard文件本质是 XML自动产出一个Storyboards.swift文件其中包含 按 Storyboard 名称生成的Storyboards枚举结构 每个控制器专属的Segue枚举含目标类型与 Segue 类型♻️ 列表/集合视图的Reusable复用标识枚举 命名颜色的静态属性扩展UIColor/NSColor核心价值在于把字符串标识符变成编译期可检查的类型。以前写performSegue(withIdentifier: ScreenOneSegue, ...)拼错字符串只有运行时才崩溃用 Natalie 后直接写perform(segue: MainViewController.Segue.screenOneSegue, sender: nil)编译期就能发现问题。二、一份代码通吃三端Natalie 的平台适配原理Natalie 的多平台不是多个工具而是同一个二进制识别 Storyboard 的目标运行时targetRuntime。它会自动判断当前 Storyboard 属于哪个平台并输出对应框架的代码平台框架Storyboard 类型控制器类型颜色类型 iOSUIKitUIStoryboardUIViewControllerUIColor macOSCocoaNSStoryboardNSViewController/NSWindowControllerNSColor tvOSUIKitUIStoryboardUIViewControllerUIColor这一套平台映射逻辑集中在 OS.swift 中它定义了每个平台下的类型差异Storyboard 类型、Segue 类型、Scene 标识类型macOS 使用NSStoryboard.SceneIdentifieriOS/tvOS 使用String、可复用视图列表等。更妙的是如果你把 iOS 和 macOS 的 Storyboard 放在同一个目录里一起生成Natalie 会自动用#if os(iOS)/#if os(OSX)条件编译把代码打包进同一个文件——一份Storyboards.swift直接拖进多平台工程即可。这一逻辑可在 Natalie.swift 的process(storyboards:)中看到。三、快速上手安装 Natalie 的两种最快方式方式一Swift Package Manager 源码编译 $ git clone https://gitcode.com/gh_mirrors/na/Natalie $ cd Natalie $ ./scripts/build.sh编译产物会出现在./Natalie/natalie把它复制到全局路径即可随处使用$ cp natalie /usr/local/bin方式二Homebrew 一键安装 $ brew install natalie安装完成后把natalie可执行文件放进项目根目录并纳入版本控制还能让 CI 在每次构建时自动生成代码保证生成文件永远是最新的。四、实战一行命令生成三端 Storyboard 代码Natalie 的用法非常简单命令行只接受两类参数单个 .storyboard 文件路径文件夹路径会递归找出其中所有 Storyboard$ natalie NatalieExample/NatalieExample/Base.lproj Storyboards.swift生成后的代码长这样以 iOS 示例工程生成的 Storyboards.swift 为例struct Storyboards { struct Main: Storyboard { static var storyboard: UIStoryboard { ... } // 按 Storyboard ID 生成类型安全的实例化方法 static func instantiateMainViewController() - MainViewController { ... } static func instantiateScreenOneViewController() - ScreenOneViewController { ... } } }调用方从此可以告别字符串// 旧的脆弱写法 let vc storyboard.instantiateViewController(withIdentifier: Screen One ViewController) // Natalie 生成的类型安全写法 let vc Storyboards.Main.instantiateScreenOneViewController()项目自带的 NatalieExample 目录下就躺着三个平台示例iOS、OSXmacOS、TVOS每个工程里都有一份生成好的Storyboards.swift是绝佳的对照学习材料——三份文件导入的框架不同、类型不同但生成命令完全相同。五、进阶玩法Segue、复用视图与颜色 Segue 类型安全跳转每个自定义控制器都会获得一个Segue枚举包含 Segue 种类kind和目标控制器类型destinationextension MainViewController { enum Segue: String, CustomStringConvertible, SegueProtocol { case screenOneSegue ScreenOneSegue var kind: SegueKind? { return SegueKind(rawValue: push) } var destination: UIViewController.Type? { return ScreenOneViewController.self } } }♻️ 复用标识不再手写在cellForRowAt中配合Reusable枚举出队单元格甚至可以在prepareForReuse()里按复用标识执行差异化逻辑。相关协议与扩展在 Reusable.swift 中实现。 命名颜色自动生成Storyboard 里用到的资产颜色会被生成为静态属性iOS 11 / macOS 10.13extension UIColor { static let Screen1 UIColor(named: Screen1) static let Screen2 UIColor(named: Screen2) }macOS 版本则自动换成NSColor——这正是 Color.swift 结合平台映射产生的结果。六、Xcode 集成每次构建自动刷新 Storyboards.swift手动运行命令太麻烦Natalie 官方推荐在 Xcode 的Build Phases中加一个Run Script Phase务必放在 Compile Sources 之前保证编译时文件已就绪脚本会检测 Storyboard 是否比生成文件新有变化才重新生成CI 友好且高效NATALIE_PATH/usr/local/bin/natalie BASE_PATH$PROJECT_DIR/$PROJECT_NAME OUTPUT_PATH$BASE_PATH/Storyboards.swift if [ ! -e $OUTPUT_PATH ] || [ -n $(find $BASE_PATH -name *.storyboard -newer $OUTPUT_PATH -print -quit) ]; then $NATALIE_PATH $BASE_PATH $OUTPUT_PATH fi然后把Storyboards.swift加入工程从此改 Storyboard 后保存、编译即自动更新整个团队都不需要再手写任何 Segue 字符串。详细的脚本配置步骤在项目 README.md 中有完整说明。七、结语Natalie 用读取 Storyboard → 解析 XML → 按平台生成 Swift 代码这条简洁链路让多平台项目的 Storyboard 管理变得既安全又省心。无论是独立 iOS 应用、macOS 桌面应用还是需要一份代码覆盖三端的跨平台工程它都能把字符串标识符带来的隐患扼杀在编译期。快去克隆项目用一条命令体验三端代码生成的快乐吧【免费下载链接】NatalieNatalie - Storyboard Code Generator (for Swift)项目地址: https://gitcode.com/gh_mirrors/na/Natalie创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考