对比
在 github 上有两个比较好用的库 R.Swift 和 SwiftGen,都很好的解决了从 字符串 到 Strongly typed identifiers 的自动工作。
- SwiftGen 相对来说依赖少一点,可配置空间更大,适合老项目引入并资源局部管理。
- R.Swift 配置简单且管理全面,适合新项目引入并资源全局管理。
最终的使用效果如下:
// SwiftGen let image = Asset.icon_return.image let font = FontFamily.SanFranciscoDisplay.semibold.font(size: 18) // R.Swift let image = R.image.icon_return() let font = R.font.sanFrancisco(size: 18)
安装
官方新版本推荐通过 brew 进行安装。
实测下来,也是 brew 安装问题最少,下载二进制包有权限问题,pod 集成有找不到
SwiftGen
的情况,别问我是怎么知道的...
brew update brew install swiftgen
使用
基础:生成代码
在项目根目录下,创建 Templates 文件夹,将下面的模板文件放入其中。
Xcassets.stencil 和 Fonts.stencil 上传到 Github 了,地址:github.com/ReverseScal…
Xcode 中添加一个 New Run Script Phase,将 Run Script 拖动到 Check Pods Manifest.lock 的下面,脚本内容如下,其中 ZGERPHomeModule
和路径需要根据项目调整:
swiftgen run xcassets $PROJECT_DIR/../ZGERPHomeModule/Assets/Media.xcassets --templatePath $PROJECT_DIR/../Templates
如需使用第三方字体,可以同时设置字体脚本。
swiftgen run fonts $PROJECT_DIR/../ZGERPHomeModule/Assets/ --templatePath $PROJECT_DIR/../Templates/Fonts.stencil --param bundleName=ZGERPHomeModule --output $PROJECT_DIR/../ZGERPHomeModule/Classes/SwiftGen/Fonts.swift
Command + B/R
脚本会根据模块中 Media.xcassets 中的资源,自动生成对应代码。
// SwiftGen xcassets template for Asprin import UIKit enum Asset { static let closedIcon = ImageAsset(name: "closed_icon") static let iconReturn = ImageAsset(name: "icon_return") } struct ImageAsset { fileprivate var name: String var image: UIImage { let bundle = ZGERPModuleAssets.currentBundle() let image = UIImage(named: name, in: bundle, compatibleWith: nil) guard let result = image else { fatalError("Unable to load image named \(name).") } return result } } class ZGERPModuleAssets: NSObject { /// 获取当前库包 internal class func currentBundle() -> Bundle { let podBundle = Bundle(for: ZGERPHomeModule.self) if let bundleURL = podBundle.url(forResource: "ZGERPHomeModule", withExtension: "bundle") { if let bundle = Bundle(url: bundleURL) { return bundle } else { return podBundle } } else { return podBundle } } }
进阶:生成 xcassets 文件
上面我们通过 xcassets 文件中的资源自动生成了引入代码,但是设计师小姐姐给到我们的素材都是 xxx@2x.png 和 xxx@3x.png 这个样子滴,如果能自动生成 xcassets 文件就好了。
1)让我在上面的 Script 文件夹下,再添加下面这个文件(上面提到的 Github 中有滴)。
2)在跟目录下创建配套的 ImageFolder,ImageFolderBackup 和 Resource 文件夹。
Demo - Templates - AutoAsset // 二进制脚本 - Fonts.stencil // 字体模板 - Xcassets.stencil // 图片模板 - ImageFolder // 图片文件夹 - ImageFolderBackup // 图片备份文件夹 - Resource // 输出路径
3)还是我们熟悉的添加脚本。
$PROJECT_DIR/script/AutoAsset $PROJECT_DIR/synchronizeImageFolder $PROJECT_DIR/synchronizeImageFolder_backup $PROJECT_DIR
4)如果要配合自动生成代码,就继续在下面添加脚本。
$PODS_ROOT/SwiftGen/bin/swiftgen xcassets $PROJECT_DIR/ResourceManageDemo/Assets.xcassets --templatePath $PROJEC
同时可以编写 Podfile 文件,把 Xcode Build Phases 加入。
source 'https://cdn.cocoapods.org/' use_frameworks! inhibit_all_warnings! platform :ios, '9.0' target 'Demo' do pod 'SwiftGen' script_phase :name => '[CP-User] Create Xcassets', :script => '$PROJECT_DIR/Script/AutoAsset $PROJECT_DIR/ImageFolder $PROJECT_DIR/ImageFolderBackup $PROJECT_DIR/Resource/Assets.xcassets', :execution_position => :before_compile end
SwiftGen 生成的产物,可以运行 swiftgen config lint
进行校验。
Linting swiftgen.yml > Common parent directory used for all input paths: <none> > Common parent directory used for all output paths: <none> > 1 entry for command xcassets: $ swiftgen xcassets --templateName swift4 --output UIImage+Assets.swift Media.xcassets