背景
在iOS的资源管理上,如本地化多语言或者图片,都是用string的形式来读取资源,这样也带来了一个问题。 比如指定的资源不存在,或者资源名称被更新,则会出现无法加载资源的问题。
常见代码如下:
let image = UIImage(named: "icon")//这里只是指定了icon的图片,但是如果图片变化,或者不存在,则不会检查到
解决的办法也比较简单,就是在编译的时候增加资源检查。 SwiftGen 就是其中一个解决该问题的三方库。
原理
SwiftGen 会根据yml文件配置规则,读取对应的资源目录,然后将所有的资源动态生成代码中的值。 如果出现资源不存在或者变化就会报错
如: 读取Asset中的所有图片,然后生成为Asset类,提供所有图片的值
接入
- 本地安装swiftgen
brew install swiftgen
- cocoapods接入 这里推荐debug的时候用即可,毕竟所有的代码都会执行之后再上传的,如果希望release检查,也可以用
pod 'SwiftGen', '6.5.1', :configurations => ['Debug']
- 配置swiftgen,制定input 和 output
这里我们指定了两种资源,string 和
strings:
inputs: Demo/Tools/Localizable/en.lproj/Localizations.strings
outputs:
- templateName: structured-swift5
output: Demo/Tools/Localizable/Strings.swift
xcassets:
inputs:
- Demo/Assets.xcassets
outputs:
- templateName: swift5
output: Demo/UIComponent/ImageManager/Assets.swift
- Build Phases中增加脚本
用法
- 更新对应资源, build项目(cmd+b)
- 代码生成完毕,直接使用即可
Localized string
let string = L10n.LoginModeList.password
Image引入
let image = Asset.gameRoomShare.image
总结
除了上述提到的本地化和图片之外,swiftgen还可以做更多资源的检查,list如下: