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()
}