R.Swift 高效引用资源文件
R.swift 介绍
R.Swift
是一款基于 Swift 平台,针对 iOS 以及 tvOS 开发的资源引用框架- 避免使用字符串来构造某些资源实例
R.Swift
能够使用类似语法R.资源类型.资源名称
来对某资源进行引用构建R.Swift
有着动态生成代码的机制, 它具有以下优点:- 代码自动补全:就像输入其他的代码一样,
R.Swift
支持 IDE 的代码自动补全 - 自动检测: 可以自动检测代码是否存在问题, 当我们的资源文件名修改的时候, 这是就会提示资源引用错误
- 代码自动补全:就像输入其他的代码一样,
R.swift 安装配置
- 安装
- CocoaPods
pod 'R.swift'
安装
- CocoaPods
- 配置
Build Phases
->New Run Script Phase
(-> 重命名为 R.swift)- 将 👆 添加的 Run Script 拖动到
Check Pods Manifest.lock
下面 - 添加脚本
"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/R.generated.swift"
- 在
Input Files
下面添加$TEMP_DIR/rswift-lastrun
- 在
Output Files
下面添加$SRCROOT/R.generated.swift
Command+B
编译项目,在项目代码目录下,会生成一个R.generated.swift
的文件,将它拖如项目中
- 注意事项
- 不要勾选
Copy items if needed
选项,因为每次编译都会生成新的R.generated.swift
文件,copy 的话,旧的R.generated.swift
将不会被覆盖 - 每当我们修改了资源,我们需要
Command + B
来编译一下项目从而让R.Swift
自动进行配置更新 - 在
.gitignore
添加*.generated.swift
避免不必要的麻烦
- 不要勾选
- 如果想自定义位置存放
R.generated.swift
- 当按照上面配置安装 Build 后成功生成
R.generated.swift
文件后 - 拖动
R.generated.swift
到逆向存放的位置 - 修改脚本
"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/(路径)/R.generated.swift"
- 修改
Output Files
$SRCROOT/(路径)/R.generated.swift
- 删除项目
R.generated.swift
,重新添加 - 在此 Build 即可
- 当按照上面配置安装 Build 后成功生成
R.swift 使用
图片
1
2
3
4//传统方式
let oldImage = UIImage(named: "yellow-image")
//R.Swift方式
let newImage = R.image.yellowImage()字体
1
2
3
4//传统方式
let lightFontTitle = UIFont(name: "Acme-Light", size: 22)
//R.Swift方式
let lightFontTitle = R.font.acmeLight(size: 22)数据文件
1
2
3
4
5
6
7//传统方式
let jsonData = Bundle.main.path(forResource: "menuList", ofType: "json")
let jsonUrl1 = Bundle.main.url(forResource: "menuList", withExtension: "json")
//R.Swift方式
let jsonData2 = R.file.menuListJson.path()
let newUrl = R.file.menuListJson()Storyboards
1
2
3
4
5
6
7
8
9
10
11
12
13
14//传统方式
let nibVC1 = UIStoryboard(name: "NibHome", bundle: nil).instantiateInitialViewController() ?? UIViewController()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialTabBarController = storyboard.instantiateInitialViewController() as? UITabBarController
let settingsController = storyboard.instantiateViewController(withIdentifier: "settingsController") as? SettingsControllerSettingsController
//R.Swift方式
let nibVC = R.storyboard.nibHome().instantiateInitialViewController() ?? UIViewController()
let storyboard = R.storyboard.main()
let initialTabBarController = R.storyboard.main.initialViewController()
let settingsController = R.storyboard.main.settingsController()Nibs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//传统方式
let nameOfNib = "CustomView"
let customViewNib = UINib(nibName: "CustomView", bundle: nil)
let rootViews = customViewNib.instantiate(withOwner: nil, options: nil)
let customView = rootViews[0] as? CustomView
let viewControllerWithNib = CustomViewController(nibName: "CustomView", bundle: nil)
//R.Swift方式
let nameOfNib = R.nib.customView.name
let customViewNib = R.nib.customView()
let rootViews = R.nib.customView.instantiate(withOwner: nil)
let customView = R.nib.customView.firstView(owner: nil)
let viewControllerWithNib = CustomViewController(nib: R.nib.customView)cell复用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//传统方式
let cellNib = UINib(nibName: "NibTableViewCell", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "NibTableViewCell")
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "NibTableViewCell", for: indexPath)
cell?.leftLabel.text = dataArr[indexPath.row]
return cell ?? UITableViewCell()
}
//R.Swift方式
tableView.register(R.nib.nibTableViewCell(), forCellReuseIdentifier: R.nib.nibTableViewCell.name)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: R.nib.nibTableViewCell.name, for: indexPath) as? NibTableViewCell
cell?.leftLabel.text = dataArr[indexPath.row]
return cell ?? UITableViewCell()
}