MVVM用のXcodeのテンプレート作ってみた

最近RxSwiftを使ったMVVMを勉強してるのですが毎回ViewController作って、ViewModel作って、連結部分書いてってやるの流石に面倒になってきたのでXcodeのテンプレート作ることにしました。

既存のテンプテートはここにあるみたいです。
`/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/`
１から作るのはめんどくさそうなので一番シンプルそうなSwiftファイルのテンプレートをコピーしていじっていこうと思います。

`Custom`というディレクトリ名で作ってみます。

```shell
sudo mkdir /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/Custom/
```

そして既存のSwiftファイルのテンプレートをコピーしてくる、ついで`MVVM.xctemplate`にリネーム

```shell
sudo cp -r /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/Source/Swift\ File.xctemplate /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/Custom/MVVM.xctemplate
```
確認してみます。

```shell
open /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/
```
こんな感じになってたらOKです。
<img width="277" alt="スクリーンショット 2019-10-02 12.27.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/0bd82a5b-0538-2bb1-1789-10ef4be913a6.png">

`___FILEBASENAME___.swift`を編集していきます。
一回の操作でViewControllerとViewModelを作りたかったので自分はこんな感じにしました。
<img width="338" alt="スクリーンショット 2019-10-02 11.41.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/86f929b7-16ad-7fa8-4339-539139261acf.png">


```swift:___VARIABLE_NAME___ViewController.swift
//___FILEHEADER___

import UIKit
import RxSwift
import RxCocoa

class ___VARIABLE_NAME___ViewController: UIViewController {

    private var disposeBag = DisposeBag()
    private let viewModel = ___VARIABLE_NAME___ViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        configure()
    }

    private func configure() {
        //outputs

        //inputs

        viewModel.inputs.configure()
    }
}

```
```swift:___VARIABLE_NAME___ViewModel.swift
//___FILEHEADER___

import Foundation
import RxSwift
import RxCocoa

protocol ___VARIABLE_NAME___ViewModelInputs {
    func configure()
}

protocol ___VARIABLE_NAME___ViewModelOutputs {
}

protocol ___VARIABLE_NAME___ViewModelType {
    var inputs: ___VARIABLE_NAME___ViewModelInputs { get }
    var outputs: ___VARIABLE_NAME___ViewModelOutputs { get }
}

final class ___VARIABLE_NAME___ViewModel: ___VARIABLE_NAME___ViewModelType, ___VARIABLE_NAME___ViewModelInputs, ___VARIABLE_NAME___ViewModelOutputs {

    //Properties
    private var disposeBag = DisposeBag()
    var inputs: ___VARIABLE_NAME___ViewModelInputs { return self }
    var outputs: ___VARIABLE_NAME___ViewModelOutputs { return self }

    //Functions
    func configure() {
    }
}
```
```xml:TemplateInfo.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Kind</key>
	<string>Xcode.IDEFoundation.TextSubstitutionFileTemplateKind</string>
	<key>Description</key>
	<string>An empty Swift file.</string>
	<key>Summary</key>
	<string>An empty Swift file</string>
	<key>SortOrder</key>
	<string>30</string>
	<key>AllowedTypes</key>
	<array>
		<string>public.swift-source</string>
	</array>
	<key>DefaultCompletionName</key>
	<string>File</string>
	<key>MainTemplateFile</key>
	<string>___FILEBASENAME___.swift</string>
    <!-- 追加ここから -->
	<key>Options</key>
	<array>
		<dict>
			<key>Identifier</key>
			<string>NAME</string>
			<key>Required</key>
			<true/>
			<key>Name</key>
			<string>名称を入力してください。 Name:</string>
			<key>Description</key>
			<string>「Hoge」と入力するとHogeViewController,HogeViewModelが生成されます。</string>
			<key>Type</key>
			<string>text</string>
			<key>Default</key>
			<string>Hoge</string>
		</dict>
	</array>
    <!-- 追加ここまで -->
</dict>
</plist>

```

変数の利用方法など[こちら](https://www.lanches.co.jp/blog/9058)のサイト様を参考にさせていただきました。

設定は以上になります。確認してみましょう。
`New File...`からの
<img width="400" alt="スクリーンショット 2019-10-02 12.01.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/86ac0473-61b0-d7aa-2346-0f4d63b2ec9a.png">
<img width="400" alt="スクリーンショット 2019-10-02 12.02.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/b058bc15-4477-8b34-0e9c-45a3b8d1d592.png">
↓↓↓ここで決めたファイル名は反映されないので適当にEnter押しちゃってください
<img width="400" alt="スクリーンショット_2019_10_02_12_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/553389fc-d8b7-d5a9-8c0f-de1f8c5b575f.png">
<img width="423" alt="スクリーンショット 2019-10-02 12.02.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/2c96bd67-aa57-e3de-f4ad-a489f22aa59a.png">
<img width="631" alt="スクリーンショット 2019-10-02 12.02.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/9e6326d2-264d-4a79-8cef-6bf692cd5f7e.png">

良い感じに出来てますね！
気がかりはファイル名を決める画面が全く機能してないところですね、できればスキップしたい、、、
なにか回避策があればコメントいただけると嬉しいです。

今回のコードは↓↓↓にアップしてます。
https://github.com/akasasan454/Xcode_template

## 追記 2019/12/2
Xcodeのバージョンアップの度に消えてしまうのでカスタムテンプレートの置き場所を
`/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/`
↓↓↓↓↓↓↓
`~/Library/Developer/Xcode/Templates`
に変更してください。