SwiftGen 自动生成资源代码

简介: SwiftGen 自动生成资源代码

对比


在 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


image.png


如需使用第三方字体,可以同时设置字体脚本。

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 中的资源,自动生成对应代码。


image.png


// 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.pngxxx@3x.png 这个样子滴,如果能自动生成 xcassets 文件就好了。


image.png


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



image.png


4)如果要配合自动生成代码,就继续在下面添加脚本。

$PODS_ROOT/SwiftGen/bin/swiftgen  xcassets $PROJECT_DIR/ResourceManageDemo/Assets.xcassets --templatePath $PROJEC


image.png


同时可以编写 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


目录
相关文章
|
存储 UED 算法
|
关系型数据库 PHP Apache
|
10月前
|
安全 前端开发 API
反向海淘客户案例:hoobuy淘宝代购集运系统搭建攻略介绍
这份攻略详细介绍了如何搭建 Hoobuy 淘宝代购集运系统。首先,通过市场调研与定位,明确目标客户和竞争态势,确定市场定位。接着,选择合适的技术栈,包括后端、前端和数据库,构建稳定高效的系统架构。核心功能涵盖 API 集成、商品展示、购物车管理、物流追踪等,确保用户体验。此外,注重安全与合规,保障用户数据和支付安全,遵守相关法律法规。最后,通过 SEO 优化、社交媒体营销和建立合作伙伴关系,推动系统的推广与运营。
|
敏捷开发 项目管理
深入理解Scrum:敏捷开发的核心原则和方法
Scrum强调迭代、协作、自组织和透明度,使团队能够更好地应对不断变化的需求和复杂性。Scrum方法的核心思想是通过一系列短期周期来交付功能,每个周期通常称为Sprint,以便及早获取用户反馈、适应变化并提供高质量的产品。
|
NoSQL Java API
Spring Boot 中集成Redis
主要介绍了 redis 的使用场景、安装过程,以及 Spring Boot 中集成 redis 的详细步骤。在实际项目中,通常都用 redis 作为缓存,在查询数据库的时候,会先从 redis 中查找,如果有信息,则从 redis 中取;如果没有,则从数据库中查,并且同步到 redis 中,下次 redis 中就有了。更新和删除也是如此,都需要同步到 redis。redis 在高并发场景下运用的很多。
|
监控 Java
JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)
JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)
369 0
|
NoSQL Java Redis
Redis 从入门到精通之Redis Pipeline
使用Redis Pipeline可以大大提高Redis的性能和吞吐量,但需要注意命令的顺序和语义,以保证数据的正确性和一致性。同时,使用Jedis和RedisTemplate实现Redis Pipeline时,需要遵循最佳实践,避免出现错误和异常。 2. 在使用Jedis实现Redis Pipeline时,需要使用Pipeline对象添加多个命令并执行,然后通过`syncAndReturnAll`方法获取所有命令的执行结果。 3. 在使用RedisTemplate实现Redis Pipeline时,需要使用`executePipelined`方法添加多个命令并执行,然后通过返回的结果列表获取
950 99
Redis 从入门到精通之Redis Pipeline
|
存储 缓存 移动开发
别催更啦!手淘全链路性能优化下篇--容器极速之路
历时1年,上百万行代码!首次揭秘手淘全链路性能优化(上)我们重点介绍了手淘在性能优化中的一些实践和思路,主要集中在原生的代码的优化,这次,我们将继续分享在手淘容器化页面如 H5 及 Weex 相关的优化实践。
别催更啦!手淘全链路性能优化下篇--容器极速之路
|
存储 SQL 固态存储
如何选择合适的云数据库架构与规格
NineData 联合创始人周振兴(苏普)受邀参加2023年 ACMUG 第一站西安站,发表了《云数据库架构与选型》主题演讲。
426 1
如何选择合适的云数据库架构与规格