從簡書遷移到掘金
之前有看到過一個Xcode外掛, 可以根據選中的屬性名自動生成對應Getter程式碼, 當時我還在想: 這東西挺有用的, 但自己一直都是xib/storyboard開發, 不太用得上. 誰知道, 沒過多久我就被告知以後的專案只能使用純程式碼程式設計了, 這就很尷尬了, 更尷尬的是那個外掛連結當時沒存, 現在怎麼找都找不到了. 後來輾轉了解到那個外掛是基於Xcode Source Editor Extensions開發的, 看了看相關資料發現不太麻煩, 就花了兩個小時自己寫了一個. 實現效果如圖:
如何使用
使用方式很簡單, 開啟外掛工程, Command+R然後選擇Xcode開始執行. 如圖:
外掛執行成功後, Dock欄會有一個黑色的Xcode圖示, 點選黑色Xcode選擇自己的專案工程開啟, 然後選中想要生成Getter程式碼的屬性列表, 最後點選Xcode工具欄的Editor->HHGetterGenerator->Source Editor Command即可(如果Editor欄沒有外掛名, 那可能是外掛執行失敗了, 重新執行即可). 如圖:
當然, 如果你覺得滑鼠點選的方式比較麻煩的話, 你也可以通過Xcode偏好設定->Key Bindings設定一下外掛的快捷鍵. 如圖:
最後, 這個外掛是按照我自己的程式碼習慣生成格式程式碼的, 各位可以根據自己的習慣修改後再安裝到自己的電腦上, 安裝過程請參考:Xcode 8 外掛——Source Editor Extensions
如何擴充
個人比較懶散, 只實現了一些自己用的上的程式碼塊, 如果你有其他需求或者文中程式碼規範不合你意, 可以自己到SourceEditorCommand.m中新增/修改原始碼, 裡面我已經定義好了一些簡單的巨集方便後續的擴充. 如果你需要新的類Getter方法, 假設類名是XXX, 那麼自己新增一個XXXGetter進行實現, 然後呢在generateGetterDescription加上ReturnGetter(XXX)即可. SourceEditorCommand.m裡面的現有實現是這些:
static inline NSArray *generateGetterDescription(NSString *className, NSString *propertyName) {
#define ReturnGetter(clsName) if ([className isEqualToString:[NSString stringWithUTF8String:#clsName]]) return clsName##Getter(propertyName);
ReturnGetter(UIView)
ReturnGetter(UILabel)
ReturnGetter(UIButton)
ReturnGetter(UITextView)
ReturnGetter(UITextField)
ReturnGetter(UIImageView)
ReturnGetter(UITableView)
ReturnGetter(UICollectionView)
return nil;
}
static inline NSArray *UIViewGetter(NSString *propertyName)
static inline NSArray *UILabelGetter(NSString *propertyName)
static inline NSArray *UIButtonGetter(NSString *propertyName)
...其他UI
複製程式碼
note: 如果你想要自己改原始碼, 需要注意一點: Xcode Source Editor不太穩定, 多次執行容易崩潰. 不過外掛工程的崩潰不會影響到我們的專案的工程, 所以不用擔心, 你需要的, 只是耐心的再次執行.