制做一个Mac APP:XcodeExtension

做为一个iOS developer 忽然想尝试Mac开发,这是我第一个Mac APPgit

这个软件目前包含如下功能github

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

如何使用

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

建立Cocoa APP

在建立工程的时候选择macOS->Cocoa Appswift


Xcode 插件

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

建立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) in
            let start = selection.startLine
            let end = selection.endLine
            let 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方法ui

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

测试

选择要测试的targetspa

选择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

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

相关文章
相关标签/搜索