Xcodeでクラスファイルを新規作成した後、毎回同じようなコードを書いていて面倒だなと感じることがあります。たとえば、
- UIViewControllerを継承したクラスにカスタムセルのUITableViewを持たせる
- NSObjectを継承したクラスをシングルトンにする
といった実装はアプリ開発ではよくありますが、手順は大体毎回同じです。
こういった実装をファイルテンプレート化しておけば、クラスファイルの新規作成時にそのコードが生成されるので、何度も同じコードを書く手間が省けとても便利です。
以下に、NSObjectを継承したシングルトンクラスのファイルテンプレートを例にとり、作成手順を説明していきます。
##1. デフォルトテンプレートをコピーしてくる
デフォルトテンプレート はXcode.appのパッケージの中身をたどって行った先にあります。
open /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/
~/Library/Developer/Xcode/Templates
がカスタムファイルテンプレートの置き場となります。
# 上記フォルダがなければ、作成してください
mkdir ~/Library/Developer/Xcode/Templates
デフォルトテンプレート から Cocoa Touchフォルダを カスタムファイルテンプレートの置き場 へコピーします。
その際に、フォルダ名を"My Cocoa Touch"にリネームします。
cp -r /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/Source/Cocoa\ Class.xctemplate ~/Library/Developer/Xcode/Templates/My\ Cocoa\ Touch.xctemplate
##2. Xcodeで試しに開く
ここで、試しにXcodeから新規ファイル作成画面を開いてみてください。テンプレートの選択肢に、コピーしてきてリネームしたフォルダ名が入っていることが確認できます。表示されない場合には、Xcodeを再起動してみてください。
※以下、フォルダ名をMy Cocoa Touchにリネームしたものとして説明します。
##3. TemplateInfo.plistを編集する
My Cocoa Touch/Objective-C class.xctemplateフォルダ配下に、"TemplateInfo.plist"というファイルがあります。
このファイルをXcodeやテキストエディタ等で開き、"Options"という要素に次の項目を追加します。
<dict>
<key>Default</key>
<string>false</string>
<key>Identifier</key>
<string>Singleton</string>
<key>Name</key>
<string>Singleton</string>
<key>RequiredOptions</key>
<dict>
<key>cocoaTouchSubclass</key>
<array>
<string>NSObject</string>
</array>
</dict>
<key>Type</key>
<string>checkbox</string>
</dict>
Xcodeから新規ファイル作成 > My Cocoa Touch > Objective-Cを選択 > Nextと進み、SubclassにNSObjectを選ぶとSingletonというチェックボックスが有効になることが確認できます。
##4. テンプレート用クラスファイルを作成する
TemplateInfo.plistと同階層にある"NSObject"というフォルダを複製して、"NSObjectSingleton"というフォルダ名にリネームします。
このフォルダ名は、手順2でTemplateInfo.plistに追記した項目のうち、Identifierと、RequiredOptionsに関係しています。
RequiredOptionsに指定してあるNSObjectをクラス生成時に親クラスとして指定し、Singletonのチェックボックスにチェックを入れると、{cocoaTouchSubclass名}+{チェックボックス項目のIdentifier}、すなわち"NSObjectSingleton"という名前がついたフォルダにあるテンプレートファイルを参照するようになります。
##5. テンプレート用クラスファイルを編集する
次に、NSObjectSingletonフォルダ配下にある、"___FILEBASENAME___.h"と、"___FILEBASENAME___.m"を編集します。
___IMPORTHEADER_cocoaTouchSubclass___
@interface ___FILEBASENAMEASIDENTIFIER___ : ___VARIABLE_cocoaTouchSubclass___
+ (id)sharedInstance;
@end
#import "___FILEBASENAME___.h"
@implementation ___FILEBASENAMEASIDENTIFIER___
static id instance = nil;
+ (id)sharedInstance {
@synchronized(self) {
if (!instance) {
instance = [[self alloc] init];
}
}
return instance;
}
@end
以上でNSObjectSingletonテンプレートは完成です。