鉴于公司非常注重代码规范,所以需要有良好的代码标注(MARK、FIXME、TODO),有利于代码文件目录清晰。
代码文件内部基本一致的集成风格,比如每个Controller都有必须实现固定方法重写,继承基础Controller等。
Xcode模板路径: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/Source
打开访达,可以一步一步找到,也可以快捷键command + shift + G 前往。
模板如下图:
对应的Xcode 新建模板如下:
既然都找到模板了,那就可以修改它。但是你仍然需要注意。
比如,我需要建一份Swift专用的模板,需要如下:
修改复制出来的模板文件名改为为MySwift,
删除文件内的无关文件,只保留Swift版本的UIViewControllerSwift,UIViewSwift等文件
修改对应文件。比如原始UIViewSwift文件
//___FILEHEADER___
import UIKit
class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
}
修改为自定义模板
//___FILEHEADER___
// <#title#>
// 简述:<#描述#>
import UIKit
class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ {
// MARK: - 属性
// MARK: - 生命周期
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
private func commonInit() {
<#初始化操作#>
}
override func layoutSubviews() {
super.layoutSubviews()
}
// MARK: - 辅助方法
}
除了更改系统模板,也可以新建自定义模板,但是要保留相应的宏定义,比如模板文件___FILEBASENAME___.swift
比如,添加一个Model模板
//___FILEHEADER___
import Foundation
import HandyJSON
@objcMembers
class OrderQRCodeModel: NSObject, HandyJSON {
required override init() {}
}
由于删除了原有模板,新建个人模板文件,所有需要修改TemplateInfo.plist部分内容,使得避免干扰和可识别新建模板文件。
Key | 描述 | 值类型 |
---|---|---|
Name | 选项标签显示名字 | String |
Description | 鼠标悬停时的描述 | String |
Type | 改选项的类型,包含:checkbox(单选框),text(输入框), static(静态文字), combo(), popup(下拉选择) | String |
Required | 如果此选项没有值,是否禁用“下一步”按钮 | Bool |
Identifier | 唯一标识,作为其他选项内容变量 | String |
Default | 默认值,可以使用其他选项的变量, | String |
Values | Type 为combo或者popup的值提供 | 字符串数组 |
RequiredOptions | 仅当选择了另一个选项的某些值时,才可用于启用当前选项。例如,仅启用另一个弹出选项的某些值的复选框。字典的键必须是另一个选项的标识符,并且字典的值必须是popup or combo 选项的值的子集数组,该数组允许启用当前选项。 |
Dictionary |
SortOrder | 控制选项的显示顺序,默认按照 options数组顺序显示。 | Number |
通过复制系统自带的代码模板和修改 plist 配置,可以快速定义自己的单文件模板,如果我想一步创建多个文件模板怎么办了?比如说一次性创建 Model, Controller, Request 等模板。
配置如下:
xctemplate.plist 配置大致如下:
{
Kind = "Xcode.IDEFoundation.TextSubstitutionFileTemplateKind";
Platforms = (
"com.apple.platform.iphoneos",
);
Options = (
{
Description = "The name of the module to create";
Identifier = "productName";
Name = "New Module Name:";
Required = YES;
Type = text;
}
);
}
将修改后的模板放在刚刚路径下Resource,重启 Xcode, 现在在项目中command + n就可以看到自己的模板了。
如果涉及到多人协同开发,也可以git远程同步与管理,通过统一脚本同步模板。
更新模板脚本
#!/bin/bash
# 更新模板
# 这里可以同步下远程仓库 git pull
# 获取当前目录路径
current_path=$(cd $(dirname $0); pwd)
echo "当前路径:${current_path}"
new_path="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/iOS/Source"
file_name='/模板文件名.xctemplate'
echo "模板路径:${new_path}"
raw_dir="${current_path}${file_name}"
new_dir=$new_path
# 复制文件 注意这里需要用双引号,解决路径含有空格问题。
cp -rvf "${raw_dir}" "${new_dir}"
# 结果为0 成功
if [ $? -eq 0 ]; then
echo "更新成功"
else
echo "更新失败"
fi
如何直接执行脚本
将后缀sh
改为.command
,双击脚本即可唤起终端执行。
前提是脚本文件已经是可执行的。如果不是可以用下面命令改变:
chmod +x 脚本路径
如何定义可以创建包含文件夹(Group)的模板,知道的兄弟告诉我一下,剖析 Uber 的 RIB 架构中 深入 RIBS,他们团队就可以通过模板创建Group 和相关代码文件
先进的 Xcode9 模板文件 详细介绍 option 参数,支持一次创建多个文件模板 github 地址