需求:每次写业务要写一堆属性,由于一直用懒加载的方式,所以要写一大堆懒加载,就想着有什么插件能自动生成getter方法,网上看了貌似也有,但是自从Xcode8以后,Xcode装插件感觉很麻烦,最后就有了自己动手撸一个自动生成getter方法插件的想法,反正需求简单,应该不难~~~
类似的制作插件教程网上也一大堆,我就把我的过程记录一下,给大家提供点思路O(∩_∩)O哈!
首先要用Xcode新建一个mac os上的工程,👇
2BC257B8-424E-4695-8343-BD53A3D71877.png
创建完之后,我们写插件代码的地方不是在这里,需要再新建一个target,不是command+N添加,是在右上角的File - New - Target,选择macOS下的Xcode Source Editor Extension。
E878C60F-CD61-4182-BCA1-3BC5666578EC.png
这时候我们的工程目录差不多就是酱紫的了。
6DD530C0-DD55-4F4C-BF28-423A65C88E31.png
PropertyGenerator就是我要做的自动生成getter插件模块。
下面我直接copy一份插件目录下的类分析
插件一旦运行起来
- 立即调用SourceEditorExtension类中的 extensionDidFinishLaunching() 方法做准备工作
- 同时检查是否自定义 commandDefinitions 变量,以确定实现插件的类名、插件名字和唯一标识符信息
- 如果没有自定义此变量,直接读取 Info.plist 文件中的配置。
点击插件中的按钮
- 直接执行我们自定义的或者 Info.plist 中 XCSourceEditorCommandClassName 对应的类文件中的 perform 方法,该方法中的参数invocation为XCSourceEditorCommandInvocation类型,包含我们点击的插件的唯一标识符属性,以及我们在点击插件前光标选中的区域等信息。
- XCSourceEditorCommandInvocation有个XCSourceTextBuffer类型的buffer属性,此类型有两个比较常用的属性lines和selections,分别代表我们点击插件前光标所在文件的所有行 和 光标选中的区域。
多个插件可以对应一个类实现文件,在代码中,用唯一标识符来区分不同的插件。
由于我要写的功能很简单,所以我直接去SourceEditorCommand类里面写就行
9B03D003-E299-4B8E-AE77-65582AAF6774.png
根据前面说的,点击插件按钮,我就要开始生成我的getter函数,那么我首先肯定要找到所有的属性,invocation.buffer.lines包含当前文件所有行数信息,遍历每一行,所有已"@property"开头的行都取出来,这里要把末尾的";"和"\n"去掉
for (NSString *line in invocation.buffer.lines) {
if ([line hasPrefix:@"@property"]) {
[properties addObject:[line substringToIndex:line.length - 2]];
}
}
这样属性的每一行都取出来后,只需要把属性名和对应类名提取出来,生成getter方法信息即可
for (NSString *property in properties) {
NSArray *sepArr = [property componentsSeparatedByString:@" "];
NSString *propertyType = [sepArr objectAtIndex:sepArr.count-2];
if ([sepArr.lastObject hasPrefix:@"*"]) {
NSString *propertyName = [sepArr.lastObject substringFromIndex:1];
[propertyMethods addObjectsFromArray:[self genPropertyMethod:propertyType propertyName:propertyName]];
}
}
- (NSArray *)genPropertyMethod:(NSString *)propertyType propertyName:(NSString *)propertyName {
return @[@"\n",
[NSString stringWithFormat:@"- (%@ *)%@ {\n", propertyType, propertyName],
[NSString stringWithFormat:@" if (!_%@) {\n", propertyName],
[NSString stringWithFormat:@" _%@ = [%@ new];\n", propertyName, propertyType],
@" }\n",
[NSString stringWithFormat:@" return _%@;\n", propertyName],
@"}"];
}
我只对对象属性生成getter方法即可,过程就是写好模板往里面填就行,注意这里的每一行都是一个单独的元素放到数组里,因为我们最后还需要将这些新增加的行数添加到buffer.lines里面,这样才会在我们的类文件里面显示。
这样一个简单的自动生成方法的插件就完成了,编译-运行,会让你选一个Xcode工程,测试OK,nice~
2D901BE0-6BC0-4C14-AA5A-F99C80423441.png
怎么在Xcode中使用
我们需要把这个插件app提取出来添加到应用程序中去
9FCA5CE2-A802-4ED1-AF3F-7842B5D4C6A0.png
D46DF11A-B399-4878-A255-6A1AE1C31523.png
在系统偏好设置 - 扩展下,确保你的插件打上了勾
然后,把Xcode重启一下就行~
屏幕快照 2017-11-14 15.15.29.png
Xcode的Editor菜单下就有你的插件了,在Xcode的Key Bindinggs下再绑定一下快捷键,体验完美~
以上是我写一个简单插件的小小过程,希望能给大家提供点思路!












网友评论