Xcode Template 和 Code Snippet提升开发效率

CodeSnippet

CodeSnippet 是代码片段的意思。

在Xcode中支持代码片段,我们可以将经常使用的代码存储为一个代码片段,并为它设置快捷键。这样,输入快捷键的时候就能将代码输入

CodeSnippet创建和使用

比如我将 @property (nonatomic, copy) NSString *name; 存储为代码片段

  1. 选中代码,右键,Create Code Snippet就行 可以为它设置快捷键、简单描述、语言、作用域等

2. 修改代码片段的属性

Command + Shift + L 或者 点击Xcode右上角的+号

点击Edit就可以重新编辑属性。也可以点击左侧delete删除这个代码片段 3. 使用快捷键,也就是上图中的 Completion后面的mynpc。输入mynpc后回车,就可以直接键入

4. 给代码片段内的部分变量添加占位符

只需要将要修改的部分使用 <#name#>包裹起来就行,其中name是你自己命名的变量。 用于在键入代码片段后作为占位

@property (nonatomic, copy) <#type#> *<#name#>; 这样修改之后,你就有了方法参数占位的体验了

代码片段存储位置

Xcode已经自带了很多代码片段,包括C、OC、C++、Swift、XML等

  1. 代码片段存储在 ~/Library/Developer/Xcode/UserData/CodeSnippets 目录中,文件名是 .codesnippet
  2. 我们可以将已有的代码片段复制到这个目录下,如果不存在这个目录,创建一份就行

目前Github上也有很多现成的CodeSnippet

  1. github.com/QMUI/QMUI_i...
  2. github.com/burczyk/Xco...

Xcode Template

模板是包含在扩展名为.xctemplate的目录中的文件的集合

Xcode在创建项目或文件时,使用了Xcode中的的模板功能,它包括iOSmacOSwatchOStvOSvisionOSDriverKit等菜单

Xcode 内置的模板存放在两个主要的地方

  1. 基础模板 /Applications/Xcode-15.0.0-Beta.6.app/Contents/Developer/Library/Xcode/Templates
  2. 分平台存储的模板/Applications/Xcode-15.0.0-Beta.6.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
  3. 文件夹里面有文件模板File Templates和工程模板Project Templates,分别对应创建文件时的选项和创建工程时的选项。

一般情况下,不会频繁创建项目,而会频繁创建文件。所以我们本次学习创建文件模板

提示:这里因为我使用的Xcode 15 beta6,所以可能和你的路径不一样

模板目录中直接包含.xctemplate的文件夹对应的是面板上的Section

而Section下的内容是由上面两个模板路径的内容以及用户自定义模板路径的内容决定的 上面分平台的 User Interface只包含除了SwiftUI View.xctemplate之外的其他四个,SwiftUI View.xctemplate则是由基础模板提供

模板知识

当我创建文件时,选择语言为Objective-C,基类为 NSObject,系统就会使用下面的模板

一个模板的内容主要包括TemplateInfo.plist、模板Icon、模板文件等

  1. TemplateInfo.plist 主要描述模板的信息
  2. 模板文件命名主要由 基类+语言(比如下图的NSObjectObjective-C) 组成
  3. 模板文件内部会使用宏来替换掉 输入的文件名 等信息
  4. TemplateIcon.img是一个48x48的图片,TemplateIcon@2x.png是一个96*96的图片。用于模板的icon展示

下图中 前后三下划线 的就是宏 ___FILEHEADER___

看一眼生成的文件,比对一下大概就知道是哪个宏对应什么内容

TemplateInfo.plist 描述模板信息

AllowedTypes 允许包含的文件类型数组

  • public.objective-c-source (Objective-C)
  • public.objective-c-plus-plus-source (Objective C++)
  • public.c-source (C)
  • public.c-plus-plus.source (C++)
  • public.c-header (header file for C, C++, Objective C)
  • public.ruby-script (Ruby)
  • public.python-script (Python)
  • com.sun.java-class (Java .class file)
  • com.sun.java-source (Java .java file)
  • public.xml (XML)
  • public.source-code (generic source code)

MainTemplateFile 模板文件源文件

如果模板有多个文件,它用于指定模板完成后哪个文件被第一个打开

SupportsSwiftPackage 是否支持SwiftPackage

Kind 模板类型

文件固定的为:Xcode.IDEFoundation.TextSubstitutionFileTemplateKind

Description 详细描述文字

Summary 简要描述文字

SortOrder 排序优先级

DefaultCompletionName 默认文件名

如果创建时不输入名称,默认使用这个

Platforms 模板所支持的平台有哪些

支持的类型有以下方面

  1. com.apple.platform.macosx
  2. com.apple.platform.iphoneos
  3. com.apple.platform.watchos
  4. com.apple.platform.appletvos
  5. com.apple.platform.xros

Options 模板选项配置

是一个集合,配置创建模板的面板相关属性,如名称,类型,选项卡,选项约束等。模板中的宏会被此处的配置值替换

Options 中有四个配置选项,通过 Name 等描述字段可知分别是"类名"、"基类名"、"是否创建XIB"、"语言选取"

常见字段

Identifier 唯一标识

模板选项的唯一标识,在模板文件中可以通过宏来引用它的值 ___VARIABLE_identifier___,用来保存模板选项的值

Required 该选项是否必须输入或选择

Name 选项名字,会显示在xcode界面上

Description 选项说明,鼠标悬浮在选项位置时会显示

Type 选项类型
  1. ViewController中类型为text(手动输入)
  2. 基类为class(类选取)
  3. 创建XIB为checkbox(勾选框)
  4. 语言选取为popup(弹框)
  5. static
  6. combo
  7. buildSetting
NotePersisted 输入值是否保留以便下次使用
FallbackHeader 如果无法确定要子类化的类的位置时导入的头文件
Suffixes 一个后缀字典,根据你要子类化的类型添加
Default 选项默认值

这个值跟选项类型(textclasscheckboxpopup)有关。例如

  1. 创建XIB的选项类型为checkbox,默认不创建,其值就为false
  2. 语言选择的选项类型为popup,是必选的,其默认值就为Objective-C
Values 某类值的集合,如果类型是combo, popup, classs时,需要提供的值数组

这个值跟当前选项具体内容有关,最直观的就是语言选项中的Values,它对应的值是用户可以选择的两种开发语言Objective-CSwift

需要分组的类型

popup、combo、class、checkbox这几种类型需要我们为其创建子目录并添加对应的模板文件,Xcode将在.xctemplate文件中查找到输入元素提供的值的子目录。

其他类型
  • static
  • text

在源模板文件中使用Options定义的的标识符变量名来引用它的关联值,从而从用户界面获取输入并将其映射到模板源中 例如,如果模板定义了一个名为viewColor的标识符,那么您可以在源模板中使用___VARIABLE_viewColor______VARIABLE_viewColor:identifier___引用变量的值。

RequiredOptions 必要选项

从XIB选项中可以看出,这个字段是与checkbox 配合的,当基类出现指定的值时,勾选框就可选

一些内置宏

  • ___PROJECTNAME___:工程名
  • ___FILENAME___:包含后缀的文件名
  • ___FILEBASENAME___:不包含后缀的文件名
  • ___FILEBASENAMEASIDENTIFIER___:不包含后缀的c格式文件名,会根据上下文被重新评估赋值。就是文件的名称
  • ___VARIABLE_cocoaTouchSubclass___:cocoaTouchSubclass 变量名
  • ___IMPORTHEADER_cocoaTouchSubclass___ 导入 cocoaTouchSubclass
  • ___FULLUSERNAME___:用户名
  • ___ORGANIZATIONNAME___:公司名
  • ___COPYRIGHT___:版权说明
  • ___DATE___:当前日期,年/月/日
  • ___TIME___:当前时间
  • ___YEAR___:当前年份
  • ___FILEHEADER___:文件头部的注释
  • productName 是一个特殊的变量,Xcode使用它去命名文件

自定义模板

自定义模板的存储位置 ~/Library/Developer/Xcode/Templates/

最快捷的创建模板的方式就是从分平台的内置模板中copy一份修修改改

创建自定义模板步骤

  1. /Applications/Xcode-15.0.0-Beta.6.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/iOS/Source/Cocoa Touch Class.xctemplate 拷贝一份模板
  2. 将模板拷贝到~/Library/Developer/Xcode/File Templates并创建自己的目录。有两种方式
  • 和原有Source在同一个Section。

    ~/Library/Developer/Xcode/Templates/File Templates/继承修改/iOS/Source/我的CocoaTouchClass.xctemplate

  • 单独一个Section

    ~/Library/Developer/Xcode/Templates/File Templates/我的模板/我的CocoaTouchClass.xctemplate

资料

  1. blog.devlxx.com/2020/06/29/...
  2. shujucn.gitbooks.io/xcode/conte...
  3. juejin.cn/post/695682...
  4. juejin.cn/post/688267...
  5. www.jianshu.com/p/1ce9a0822...
  6. www.jianshu.com/p/2538fb02d...
  7. www.kodeco.com/26582967-xc...
  8. www.andyibanez.com/posts/xcode...
  9. medium.com/mindful-eng...
  10. diamantidis.github.io/2019/07/21/...

官方资料

  1. help.apple.com/xcode/mac/1...
相关推荐
关键帧Keyframe1 天前
音视频面试题集锦第 15 期 | 编辑 SDK 架构 | 直播回声 | 播放器架构
音视频开发·视频编码·客户端
Cyrus丶1 天前
前端组件化开发指南(二)
前端·代码规范
FrozenMoments3 天前
编写可读代码的艺术
代码规范
陈陈陈建蕾6 天前
回顾前端 - 为多个小程序设计一个MonoRepo架构
前端·架构·代码规范
记忆深处的声音6 天前
vue2 + Element-ui 二次封装 Table 组件,打造通用业务表格
前端·vue.js·代码规范
关键帧Keyframe6 天前
iOS 不用 libyuv 也能高效实现 RGB/YUV 数据转换丨音视频工业实战
音视频开发·视频编码·客户端
y0ungsheep8 天前
CTF中的phar反序列化 [SWPU 2018]SimplePHP
运维·web安全·网络安全·php·代码规范
关键帧Keyframe8 天前
音视频面试题集锦第 7 期
音视频开发·视频编码·客户端
关键帧Keyframe8 天前
音视频面试题集锦第 8 期
ios·音视频开发·客户端
前端郭德纲12 天前
如何修改远程分支?修改了会影响什么?
git·github·代码规范