制作一个Mac APP:XcodeExtension

news/2025/3/22 2:06:27

作为一个iOS developer 突然想尝试Mac开发,这是我第一个Mac APP

这个软件目前包含以下功能

  • ConvertFromCase 把选择的下划线内容变为驼峰
  • DeleteEmptyLines 删除选中的空行
  • SortLines 排列选中的行
  • JsonToModel 把Json数据转成Swift模型,会把下划线命名变为驼峰

如何使用

  1. 下载最新的版本
  2. 解压之后可以把应用移到应用程序中,方便下次使用!
  3. 打开应用!
  4. 在安全与隐私设置中点仍要打开
  5. 打开的界面可以把Json数据转成Swift模型,会把下划线命名变为驼峰。在左边放入Json,点击转换。
  6. 在设置中选择扩展,勾上这些功能。
  7. 打开Xcode,在菜单栏中Editor中就可以看到这些插件

创建Cocoa APP

在创建工程的时候选择macOS->Cocoa App


Xcode 插件

Apple在Xcode8的时候引入插件开发,虽然很弱鸡,但是还是能实现部分功能的。

创建target

新建target 选择macOS->Xcode Source Editor Extension

XcodeKit

创建名字DeleteEmptyLines的target会有以下文件

  • info.plist文件中是target的配置

XCSourceEditorCommandName 这里可以改名字

  • SourceEditorExtension.swift中实现了XCSourceEditorExtension 都是可选方法
    • extensionDidFinishLaunching插件在启动的时候执行
    • commandDefinitions这个地方会覆盖info.plist的设置
  • SourceEditorCommand.swift中实现了XCSourceEditorCommand
    • perform 一旦触发插件的命名,就会触发此方法,参数invocation:XCSourceEditorCommandInvocation包含了文本缓存的内容buff
    • buff.selections 就是选中文本的范围,buff.lines 是每一行的文本,我们可以改变它来改变文本的内容

实现第一个插件-删除所选代码中的空行

增加以下代码

extension XCSourceEditorCommandInvocation {var selections: [XCSourceTextRange] {return buffer.selections as! [XCSourceTextRange]}func deleteEmptyLines() {selections.forEach { (selection) inlet start = selection.startLinelet end = selection.endLinelet emptyIndexs = (start...end).filter({ (index) -> Bool in(buffer.lines[index] as! String).match(regular: "^\\s*$")})buffer.lines.removeObjects(at: IndexSet(emptyIndexs))}}
}
extension String {func match(regular: String) -> Bool {return range(of: regular, options: .regularExpression) != nil}
}
extension XCSourceTextRange {var startLine: Int {return start.line}var endLine: Int {return end.line - (end.column == 0 ? 1 : 0)}
}
复制代码

SourceEditorCommand中修改perform方法

func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) {defer { completionHandler(nil) }invocation.deleteEmptyLines()
}
复制代码

测试

选择要测试的target

选择Xcode

会有一黑色的Xcode用于测试

任意打开一个项目

  1. 选中一段代码
  2. 在菜单栏选择 Editor-> DeleteEmptyLines -> Source Editor Command

如果不是这个命名就这样找: Editor —> Extension bundle display name -> command name


Json转model界面

在iOS开发的时候,由于后台返回的数据用的是下划线命名法,而APP使用的是驼峰命名法,于是我做了一个界面来处理。

界面

选择工程中的Main.storyboard,在View Controller中拖入两个TextView,和一个button

调整控件的样式,加上布局约束。写成喜欢的样式-,-

绑定这些控件到ViewController代码中

代码

convert方法中写转换的代码就行了,代码较长放在文章末尾的GitHub链接。

有一个细节需要注意,macOS在输入引号的时候会自动转为Json不能解析的格式,所以需要设置NSTextViewisAutomaticQuoteSubstitutionEnabledfalse

运行效果

在左边放入Json,点击转换。


源码和软件下载地址

GitHub

Download

本文版权属于再惠研发团队,欢迎转载,转载请保留出处。@白尔摩斯


https://dhexx.cn/news/show-2612006.html

相关文章

C# 递归获取 文件夹的 所有文件

public void Director(string dir, List<string> list) {DirectoryInfo d new DirectoryInfo(dir);FileInfo[] files d.GetFiles();//文件DirectoryInfo[] directs d.GetDirectories();//文件夹foreach (FileInfo f in files){list.Add(f.Name);//添加文件名到列表中 …

天台人满为患,不如来看下这个Ramnit蠕虫DesktopLayer.exe分析

今年的世界杯越来越看不懂&#xff0c;想去天台吹吹风都不一定有位置&#xff0c;心凉了&#xff0c;事儿还得做&#xff0c;先从网上抓个可疑样本压压惊&#xff01;上手分析才发现并没有我想得那么简单…… 一、基本信息 MD5ff5e1f27193ce51eec318714ef038bef 文件大小 55 KB…

软件架构设计2

中间件提高开发效率 提高复用性 安全性 降低难度 中间件代理机制 适配器 是进行接口转换 java架构体系里面 不同的名词对应的组件是有好处的 数据库规范程度越高 数据表拆的越散 避免数据的冗余&#xff0c;操作异常等一系列问题。表格拆的太散 会带来效率问题 负载均衡 做业…

TOMCAT源码分析-事件与监听

开篇 作为Tomcat生命周期的补充&#xff0c;解释下事件的触发。 源码部分 每个容器由于继承自LifecycleBase&#xff0c;当容器状态发生变化时都会调用fireLifecycleEvent方法生成LifecycleEvent&#xff0c;并且交由此容器的事件监听器处理。通过addLifecycleListener添加事件…

架构论文准备

数据库建模 概念模式关系模型 可靠性 冗余备份 安全性 安全技术 加密 信息摘要 数字证书 体系结构 就是 架构风格 架构的演化 就是考察架构风格 以前用什么架构 现在用什么架构架构优缺点 。 论面向服务的架构设计 就是SOA 摘要 背景 两段 过度段 回应题目子题目…

GMTC 大前端时代前端监控的最佳实践

摘要&#xff1a;今天我分享的内容分成三个部分&#xff1a; 第一部分是“大前端时代前端监控新的变化”, 讲述这些年来&#xff0c;前端监控一些新的视角以及最前沿的一些思考。 第二部分"前端监控的最佳实践"&#xff0c; 从使用的角度出发&#xff0c;介绍前端监控…

dubbo源码解析(三十一)远程调用——rmi协议

远程调用——rmi协议 目标&#xff1a;介绍rmi协议的设计和实现&#xff0c;介绍dubbo-rpc-rmi的源码。前言 dubbo支持rmi协议&#xff0c;主要基于spring封装的org.springframework.remoting.rmi包来实现&#xff0c;当然最原始还是依赖 JDK 标准的java.rmi.*包&#xff0c;采…

Spring Clould负载均衡重要组件:Ribbon中重要类的用法

Ribbon是Spring Cloud Netflix全家桶中负责负载均衡的组件&#xff0c;它是一组类库的集合。通过Ribbon&#xff0c;程序员能在不涉及到具体实现细节的基础上“透明”地用到负载均衡&#xff0c;而不必在项目里过多地编写实现负载均衡的代码。比如&#xff0c;在某个包含Eureka…

LOJ #6032 「雅礼集训 2017 Day2」水箱

题目链接 https://loj.ac/problem/6032 题解 扫描线&#xff0c;先将每个操作按照y轴排序&#xff0c;考虑水从下面淹到上面。 对于挡板被截断的情况&#xff1a;并查集合并左侧和右侧的格子。 对于要求没有水的情况&#xff1a;如果水不淹到上面&#xff0c;那么它一定会被满足…

Designated Initializer 指定初始化方法

小菜编程成长记之 《Designated Initializer》 这是小菜去公司实习的第一周&#xff0c;为了好好表现自己&#xff0c;小菜下班后都留在公司继续看书学习iOS。这一天小菜在看某个开源代码的时候发现了一个之前没有见过的宏 NS_DESIGNATED_INITIALIZER。 在经过两个个小时的百度…