用了一段時(shí)間Tools for Xcode,感覺生成代碼功能挺好用的,很好奇它是如何實(shí)現(xiàn)的。搜索一番,最后找到了Source Editor Extension。

此文只是大致梳理了Source Editor Extension的使用流程及遇到的問題,詳細(xì)內(nèi)容可查看蘋果官方文檔XcodeKit,另外本文最后實(shí)現(xiàn)了一個(gè)自定義生成Getter的demo。
創(chuàng)建一個(gè)源代碼編輯器擴(kuò)展
您可以使用 XcodeKit 在 Xcode 中構(gòu)建源代碼編輯器的擴(kuò)展。源代碼編輯器擴(kuò)展可以讀取和修改源文件的內(nèi)容,以及讀取和修改編輯器中的當(dāng)前選擇的文本。
在 Xcode 中創(chuàng)建一個(gè)新的 macOS 項(xiàng)目
要?jiǎng)?chuàng)建源代碼編輯器擴(kuò)展,首先在 Xcode 中創(chuàng)建一個(gè)新的 macOS 項(xiàng)目。將一個(gè)新的 Xcode Source Editor Extension 目標(biāo)添加到您的項(xiàng)目中,如下圖所示,并在出現(xiàn)提示時(shí)將其激活。
![]() |
![]() |
|---|
添加extension完成后,會(huì)自動(dòng)生成SourceEditorCommand類,該類實(shí)現(xiàn)了XCSourceEditorCommand協(xié)議,協(xié)議中定義了performCommandWithInvocation:completionHandler:方法,當(dāng)用戶點(diǎn)擊菜單中添加的命令時(shí),都會(huì)調(diào)用此方法。
添加可自定義的行為
添加命令
在添加的extension目錄下找到info文件,并在XCSourceEditorCommandDefinitions下添加item。

實(shí)現(xiàn)命令功能
在SourceEditorCommand文件中,通過填寫方法的主體,將可自定義的行為添加到您的源代碼編輯器擴(kuò)展。以下示例顯示了一個(gè)反轉(zhuǎn)源代碼編輯器中的行順序的命令: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)
}
}
測(cè)試您的源代碼編輯器擴(kuò)展
源代碼編輯器擴(kuò)展在單獨(dú)的 Xcode 中運(yùn)行,以幫助防止正在進(jìn)行的擴(kuò)展中的錯(cuò)誤干擾您的開發(fā)環(huán)境。
測(cè)試源代碼編輯器擴(kuò)展
選擇擴(kuò)展方案后,通過運(yùn)行extension來測(cè)試您正在開發(fā)的源代碼編輯器擴(kuò)展。將出現(xiàn)一個(gè)對(duì)話框,要求您選擇要運(yùn)行的應(yīng)用程序。

選擇 Xcode,您的源代碼編輯器擴(kuò)展在 Xcode 的第二個(gè)實(shí)例中初始化。您可以根據(jù)應(yīng)用程序圖標(biāo)的背景顏色來區(qū)分 Xcode 的兩個(gè)實(shí)例。運(yùn)行源代碼編輯器擴(kuò)展的 Xcode 實(shí)例具有黑色背景,而不是第一個(gè)實(shí)例的淺藍(lán)色背景。

要測(cè)試您的擴(kuò)展定義的命令,請(qǐng)?jiān)?Xcode 的測(cè)試實(shí)例中打開一個(gè)源文件。擴(kuò)展程序定義的所有命令都出現(xiàn)在
Editor中,嵌套在擴(kuò)展程序的名稱下,如下圖:
選擇一個(gè)命令后,SourceEditorCommand類中的
performCommandWithInvocation:completionHandler:方法將會(huì)被調(diào)用。通過參數(shù)XCSourceEditorCommandInvocation中的commandIdentifier來區(qū)分不用的命令。
當(dāng)您測(cè)試您的源代碼編輯器擴(kuò)展時(shí),Xcode的原始實(shí)例會(huì)繼續(xù)運(yùn)行。您可以使用它來調(diào)試或查看您正在測(cè)試的擴(kuò)展的控制臺(tái)輸出。
踩坑
1.運(yùn)行黑色Xcode后,Editor下沒有出現(xiàn)定義的命令
首先確認(rèn)info文件中的命令配置無(wú)誤后,可嘗試把XcodeKit.framework刪除后重新導(dǎo)入。

然后再確認(rèn)下設(shè)置擴(kuò)展中,您的應(yīng)用程序是否選中Xcode Source Editor

實(shí)戰(zhàn)——實(shí)現(xiàn)自定義Getter生成工具
使用流程
選中屬性后,點(diǎn)擊Editor下配置的Getter生成命令(可配置快捷鍵),便可自動(dòng)生成對(duì)應(yīng)的Getter方法,生成的Getter方法模版可自定義。
![]() |
![]() |
![]() |
|---|
自定義Getter介紹
將對(duì)應(yīng)類的Getter模版拷貝到上方的輸入框中,點(diǎn)擊添加按鈕即可添加。當(dāng)類已添加時(shí),會(huì)覆蓋模版。

實(shí)現(xiàn)大致流程
- 獲取到選中的行,然后遍歷處理每一行
- 嘗試獲取行中屬性的
類名和屬性名,獲取失敗則continue - 根據(jù)獲取的
類名找到對(duì)應(yīng)的Getter方法模版 - 替換模版中的
類名和屬性名
源碼已上傳Github,OwnTools。




