用了一段时间Tools for Xcode
,感觉生成代码功能挺好用的,很好奇它是如何实现的。搜索一番,最后找到了Source Editor Extension
。
此文只是大致梳理了Source Editor Extension
的使用流程及遇到的问题,详细内容可查看苹果官方文档XcodeKit,另外本文最后实现了一个自定义生成Getter
的demo。
创建一个源代码编辑器扩展
您可以使用 XcodeKit
在 Xcode 中构建源代码编辑器的扩展。源代码编辑器扩展可以读取和修改源文件的内容,以及读取和修改编辑器中的当前选择的文本。
在 Xcode 中创建一个新的 macOS 项目
要创建源代码编辑器扩展,首先在 Xcode 中创建一个新的 macOS
项目。将一个新的 Xcode Source Editor Extension
目标添加到您的项目中,如下图所示,并在出现提示时将其激活。
添加extension完成后,会自动生成SourceEditorCommand类,该类实现了XCSourceEditorCommand协议,协议中定义了performCommandWithInvocation:completionHandler:
方法,当用户点击菜单中添加的命令时,都会调用此方法。
添加可自定义的行为
添加命令
在添加的extension
目录下找到info
文件,并在XCSourceEditorCommandDefinitions
下添加item
。
实现命令功能
在SourceEditorCommand
文件中,通过填写方法的主体,将可自定义的行为添加到您的源代码编辑器扩展。以下示例显示了一个反转源代码编辑器中的行顺序的命令:performCommandWithInvocation:completionHandler:
class SourceEditorCommand: NSObject, XCSourceEditorCommand {
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void {
// Retrieve the contents of the current source editor.
let lines = invocation.buffer.lines
// Reverse the order of the lines in a copy.
let updatedText = Array(lines.reversed())
lines.removeAllObjects()
lines.addObjects(from: updatedText)
// Signal to Xcode that the command has completed.
completionHandler(nil)
}
}
测试您的源代码编辑器扩展
源代码编辑器扩展在单独的 Xcode 中运行,以帮助防止正在进行的扩展中的错误干扰您的开发环境。
测试源代码编辑器扩展
选择扩展方案后,通过运行extension
来测试您正在开发的源代码编辑器扩展。将出现一个对话框,要求您选择要运行的应用程序。
选择 Xcode,您的源代码编辑器扩展在 Xcode 的第二个实例中初始化。您可以根据应用程序图标的背景颜色来区分 Xcode 的两个实例。运行源代码编辑器扩展的 Xcode 实例具有黑色背景,而不是第一个实例的浅蓝色背景。
要测试您的扩展定义的命令,请在 Xcode 的测试实例中打开一个源文件。扩展程序定义的所有命令都出现在
Editor
中,嵌套在扩展程序的名称下,如下图:选择一个命令后,SourceEditorCommand类中的
performCommandWithInvocation:completionHandler:
方法将会被调用。通过参数XCSourceEditorCommandInvocation
中的commandIdentifier
来区分不用的命令。
当您测试您的源代码编辑器扩展时,Xcode的原始实例会继续运行。您可以使用它来调试或查看您正在测试的扩展的控制台输出。
踩坑
1.运行黑色Xcode后,Editor下没有出现定义的命令
首先确认info文件中的命令配置无误后,可尝试把XcodeKit.framework删除后重新导入。
然后再确认下设置扩展中,您的应用程序是否选中Xcode Source Editor
实战——实现自定义Getter生成工具
使用流程
选中属性后,点击Editor
下配置的Getter
生成命令(可配置快捷键),便可自动生成对应的Getter
方法,生成的Getter
方法模版可自定义。
自定义Getter介绍
将对应类的Getter
模版拷贝到上方的输入框中,点击添加
按钮即可添加。当类已添加时,会覆盖模版。
实现大致流程
- 获取到选中的行,然后遍历处理每一行
- 尝试获取行中属性的
类名
和属性名
,获取失败则continue
- 根据获取的
类名
找到对应的Getter
方法模版 - 替换模版中的
类名
和属性名
源码已上传Github,OwnTools。
网友评论