Xcode扩展

在今年的WWDC期间,Apple宣布了Xcode Source Editor Extensions,这是一种扩展我们最喜欢的工具的功能的简便新方法。 如果您对如何利用其功能提高生产力感到好奇,请继续阅读。

软件开发行业中许多聪明的人都认为我们的职业是一种手工艺。 这种隐喻的一个方面尤其是真实的-工具。 伟大的工匠需要伟大的工具,但是随着谚语的流逝, “一个坏工人总是责备他的工具”

Christoph Gockel提醒我们,我们应该“为工作选择合适的工具”,如果没有,我们应该创建自己的工具,这正是我们要做的。

Xcode曾经有大量的第三方插件。 “习惯于”,因为Xcode 8将不再支持它们。 这是一个非常令人遗憾的消息,但是这样做的理由特别充分(与安全性和可靠性有关)。

苹果还知道工程师不喜欢抽空并阻止我们做一些不负责任的事情,例如剥离IDE的代码签名,他们为我们提供了一种构建自己的自定义工具的新方法。 WWWC演讲很好地描述了新的可能性,但是在App’n’roll,我们知道最好的学习方法是弄脏双手。

JSON模型

你们中的许多人可能在应用程序中使用了网络,因此您有时会不得不解析JSON并为其编写模型。 IDE可以为我们完成这项任务,因此我们决定为其编写扩展。 为了简单起见,我们必须做一些假设。 首先,我们希望当前编辑的文件的内容必须为JSON。 其次,我们将忽略与嵌套对象有关的边缘情况。

重要说明:我们的示例是使用Xcode 8.0 beta 2创建的,因此它可能无法始终按预期运行。 如果您仍在使用El Capitan,则必须遵循Xcode 8.0 Beta发行说明中的​​说明-Xcode 8.0 beta中的已知问题-IDE,源代码编辑器扩展。 另外,请记住在运行扩展程序时要耐心等待。 如果您打开项目的速度太快(在扩展加载之前),则无法从测试Xcode实例的菜单中使用它。

让我们首先创建一个新的macOS项目(确保选中“单元测试”框),然后将新目标添加到默认应用程序中-Xcode Source Editor Extension

这将为我们和两个新类创建一个Info.plist 。 在深入研究代码之前,我们先来看一下Plist 。 要更改Xcode菜单中显示的名称,您必须编辑Bundle NameXCSourceEditorCommandName。

首先为我们生成的类会向XCSourceEditorExtension进行确认,并会在加载扩展时通知我们。 我们不会在项目中对其进行修改。 第二类向XCSourceEditorCommand确认-一种仅具有一个方法的协议- 执行(使用invocation:complementHandler :)将在我们调用命令时执行。 该扩展名将为我们提供当前文件的内容以及修改它的方法。 我们将使用一个简单的抽象层来简化单元测试。 我们与文件的交互受到SourceFile协议的限制:

我们的下一步是创建一个易于测试的辅助对象。
我们称之为JSONConverter:

它只有一种接受SourceFile的方法,如果出现问题,可能会引发异常。 与XCSourceEditorCommand集成需要一个简单的适配器,如下所示:

如我们所料,运行扩展并执行命令不会执行任何操作。 现在是一些TDD的时候了。 首先,我们需要设置要测试的系统,并为源文件编写一个测试双精度:

我们的第一个测试将检查是否解析了无效的JSON:

这是使它通过的代码:

下一步是使用一个String属性解析一个简单的JSON。
这是测试:

…这是实现:

现在我们要作弊-我们将为NSNumber的不同变体编写三个测试:

…我们将使它们一次全部通过。 这段代码检查对象的运行时类型,并为其使用相应的Swift类型:

我们列表的下一个是数组。 这是测试:

…和实施:

我们要支持的最后一个功能是解析嵌套类型。 最简单的测试足以说明这一点:

嵌套类型比其他类型需要更多的更改,因此以下是更改后的JSONConverter的完整实现:

而已。 我们需要更新一些测试,以使它们在模型命名系统更改后通过。 JSONConverter已经与XCSourceEditorCommand集成在一起,因此我们要做的最后一件事就是检查它在Xcode中的工作方式。

恭喜,您已经完成了第一个Xcode Source Editor Extension

摘要

对于每个软件开发人员来说,工具都是最重要的领域之一。 我们的IDE提供者并不总是为我们提供所需的东西,因此有时我们不得不自己处理问题。 Xcode Extensions是学习如何进行此操作的理想起点。

目前没有太多可能性,但是了解Apple只是第一步,当我们可以访问该项目的AST和文件系统时-天空是极限。 您可以在Github上找到该示例的完整源代码。

我们很乐意听取您的意见

它对您有用吗? 我们是否拓宽了您对Xcode扩展的理解? 您想看到更多类似的内容吗? 您想补充什么吗,我们错过了什么吗?

请随时在下面的评论中或通过社交媒体与我们分享您的经验和问题 (也向我们发送一些照片或视频),您可以在Facebook,Twitter,Instagram和Pinterest上找到我们,让我们联系!

要了解有关App’n’roll的更多信息,请查看我们的网站和其他文章。 如果您喜欢阅读本文,请点击鼓掌并推荐!

使用的所有图像均为 CC0 1.0 Universal(CC0 1.0)