美文网首页
动手做一个Xcode插件

动手做一个Xcode插件

作者: leejnull | 来源:发表于2017-11-14 15:18 被阅读20次

需求:每次写业务要写一堆属性,由于一直用懒加载的方式,所以要写一大堆懒加载,就想着有什么插件能自动生成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下再绑定一下快捷键,体验完美~

以上是我写一个简单插件的小小过程,希望能给大家提供点思路!

相关文章

网友评论

      本文标题:动手做一个Xcode插件

      本文链接:https://www.haomeiwen.com/subject/nsvxvxtx.html