製做一個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

本文版權屬於再惠研發團隊,歡迎轉載,轉載請保留出處。@白爾摩斯

相關文章
相關標籤/搜索