工程中使用图片主要有两种方式:
- UIImage.init(named: "imageKey")
- Image Literal 在Xcode中直接选择要使用的图片。
问题
第一种方式直接输入图片全名,很容易拼错,并且拼错之后没有任何提示。
第二种方式使用Image Literal可以通过Xcode提示直接选择需要的图片,看上去可以完美替代第一种方式,但是当图片名字改变或者被删除时,同样无法获得编译器提示。
改进
使用swiftgen,通过读取图片资源,生成UIImage的枚举代码。这样我们在使用图片资源的时候还能通过编译器提示获取需要的图片,并且可以通过执行脚本使图片资源与模版代码生成的Image case保持一致,使用指南
替换现有的代码
引入swiftgen之后,面临的一大问题就是怎么把已有的代码全部替换为Image case,例如:
UIImage.init(named: "reviewIcon")
需要替换为:
Asset.reviewIcon.image
工程中使用图片的地方有千百个,一个一个手动的替换就显得太僵硬了。
正则匹配替换
庆幸的是Xcode提供了正则替换的功能,可以使用如下正则替换:
但是,由于长期的图片累积有些图片名字并不是驼峰的命名方式,比如:
UIImage.init(named:"a_logo")
类似这样名字的图片,经过上述正则替换后对应的代码为:
Asset.a_logo.image
而a_logo对应生成的Image case为:
static let aLogo = ImageAsset(name: "a_logo")
所以这时编译器会提示编译错误。
如何将下划线命名转化为驼峰命名?
Xcode的正则替换只允许做如上简单的匹配替换,没有提供进一步转换匹配到的字符串的功能,所以只能换个支持转化正则匹配结果的编辑器,我使用的是Sublime。
使用Sublime打开工程,在上述正则替换的基础上键入如下匹配替换:
"\u" 的意思是把匹配到的字符串首字母大写输出,这样就完成了驼峰命名的转换,匹配转换规则在这里可以找到。