📋

Xcodeのファイルテンプレート機能をチームで使う 前編

2024/12/10に公開

はじめに

これは株式会社TimeTree Advent Calendar 2024の10日目の記事です。
https://qiita.com/advent-calendar/2024/timetree

昨日は @gonseeiOSアプリのApple Vision Pro互換モード対応 でした。
visionOS、チャレンジングでかっこいいですね!(Apple Vision Proもうちょっと安くなってくれ!頼む!)
https://zenn.dev/timetree/articles/5efa46f1f6a0eb?redirected=1


こんにちは。TimeTreeのiOSエンジニアの @pengtaros です。正直度90%、ユーモア度75%で日々仕事をしています。

突然ですが、皆さんXcodeのファイルテンプレート機能は使っていますか?
Xcode起動中に⌘ + Nを押すと選択できるものです。
Xcodeのファイルテンプレート選択画面
UIやユニットテストのコードを書くときに使う人が多いのでは?

最近だとWWDC2024で発表された Swift Testing 用のファイルテンプレートが追加されましたね。
Swift Testing Unit Testのファイルテンプレート
TestセクションにSwift Testing Unit Testが追加されている

これらのファイルテンプレートの存在はいくつかのメリットを私たちに与えてくれます。

  1. ボイラープレートコードの入力の手間を省く(例: SwiftUI View や Swift Testing Unit Test)
  2. いちから作成するのが困難なファイルの雛形を作成できる(例: Storyboard)

チームでソフトウェアを開発しているときに、既存のファイルテンプレート以外でこれらのメリットを必要とする場合があります(特に1の理由)

例えば以下のような場合です。

  • 特定のアーキテクチャを採用しており、新しい画面を作るたびにボイラープレートコードを書いている場合
    • 例: MVVMのViewやViewModel、VIPERのViewやPresenterなど
  • コードベースの中でチーム内の作法通りに繰り返し書くコードがある場合
    • 例: CoreDataの操作、Backendのエンドポイントへのリクエスト用のクラス

この記事ではXcodeのカスタムファイルテンプレートを使ってこれらのニーズに応える方法を紹介します。

対象読者

この記事は以下の読者を主な対象としています

  • Xcodeを使ってコードを書いている
  • 同一プロジェクト内で同じようなコードを書く場面が多く煩わしさを感じている
  • (オプション)チームの開発生産性を上げたいと考えている
  • (オプション)TimeTreeのiOSチームの開発実態を覗きたい

達成できること

記事を読んで以下のことが達成できるような内容になっています

  • 前編(この記事)
    • Xcodeにカスタムファイルテンプレートを追加できる
  • 後編(株式会社TimeTree Advent Calendar 2024の12/21の記事で公開予定)
    • Xcodeのカスタムファイルテンプレートに変数を追加できる
    • カスタムファイルテンプレートをチーム内で共有できる

カスタムファイルテンプレートを使ってボイラープレートコード作成の手間を削減しましょう。

ファイルテンプレートのディレクトリ構造と管理方法

カスタムファイルテンプレートを作成する前に、ファイルテンプレートのディレクトリ構造と管理方法を紹介します。

ディレクトリ構造

カスタムファイルテンプレートの最小のディレクトリ構造は以下のとおりです

  • {ファイルテンプレート名}.xctemplateディレクトリ
    • TemplateInfo.plist
    • 雛形ファイル(例: ___FILEBASENAME___.swift)

例としてSwift Testing Unit Testのディレクトリ構造を見てみます
Swift Testing Unit Testのディレクトリ構造
Swift Testing Unit Testのディレクトリ構造

カスタムファイルテンプレートもこの構造に則って作成します。

管理方法

既存のファイルテンプレートはXcodeアプリに保存されています。
ファイルテンプレートは用途により保存場所が異なります。
具体的には以下の3つです。

個別のプラットフォーム用

個別のプラットフォーム(iOS)用のテンプレートの保存場所
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates

Storyboardのテンプレート
iOSアプリ開発で使うStoryboardのテンプレートの例

共通用

共通用のテンプレートの保存場所
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates

Swift Testing Unit Testのテンプレート
マルチプラットフォームで利用可能なSwift Testing Unit Testのテンプレートの例

カスタムファイルテンプレート用

カスタムファイルテンプレート保存場所
/Users/{ユーザー名}/Library/Developer/Xcode/Templates

カスタムファイルテンプレートの保存場所
最初カスタムファイルテンプレートの保存用のディレクトリの中は空のはず

Xcodeはそれぞれの保存場所を参照してファイルテンプレート選択画面に内容を表示します。
カスタムファイルテンプレートをXcodeアプリ外の参照先に保存することで、新バージョンのXcodeをインストールした場合でもテンプレートを引き継いで利用することができます。

カスタムファイルテンプレートの作成手順

ファイルテンプレートのディレクトリ構造と管理方法がわかったので、実際にカスタムファイルテンプレートを作成してみましょう。

手順は次のとおりです

  1. 手本となる既存のファイルテンプレートを.xctemplateディレクトリごとコピーする
  2. カスタムファイルテンプレートの置き場を用意し、1のコピーを置く
  3. 2のテンプレート用のファイルを編集する

決まった内容を出力する最もシンプルな例

まずは既存のファイルテンプレート Swift File で試しにSample1.swiftというファイルを作ってみましょう。

Swift Fileのテンプレート選択画面
Swift Fileのテンプレート選択画面
ファイル名として"Sample1"を入力
ファイル名として"Sample1"を入力

Sample1.swift
//
//  Sample1.swift
//  XcodeCustomTemplateSample
//
//  Created by pengtaros on 2024/12/10.
//

import Foundation

ヘッダーのコメントと import Foundation だけが書かれた Sample1.swift というファイルが作成されます。
この内容を少し変えたものを作りながら、カスタムファイルテンプレートの作成手順を説明します。

1. 手本となる既存のファイルテンプレートを.xctemplateディレクトリごとコピーする

Swift File はプラットフォーム共通のテンプレートです。

/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/MultiPlatform を探すと、Source ディレクトリ配下にSwift File.xctemplate ディレクトリを確認することができます。
Swift File
Swift File.xctemplate

.xctemplate ごとコピーしましょう。

2. カスタムファイルテンプレートの置き場を用意し、1のコピーを置く

カスタムファイルテンプレートの保存場所にファイルテンプレート選択画面でセクションの役割を果たすディレクトリを作成します。

mkdir /Users/{ユーザー名}/Library/Developer/Xcode/Templates/My\ Templates

セクション用のディレクトリ "My Templates" を作成
セクション用のディレクトリ "My Templates" を作成

1でコピーしたSwift File.xctemplate/Users/{ユーザー名}/Library/Developer/Xcode/Templates/My\ Templates にコピーしましょう。

Swift File.xctemplateを複製

この時点でXcodeを開いて⌘ + Nを実行するとテンプレート選択画面に My Templatesセクションが追加され、コピーしてきた Swift File を選択することができます。
テンプレート選択画面にMy Templatesセクションが追加される

3. 2のテンプレート用のファイルを編集する

My Templates/Swift File.xctemplate/___FILEBASENAME___.swift を編集して作成されるファイルの内容を変更しましょう。
___FILEBASENAME___.swiftを編集する
___FILEBASENAME___.swiftを編集する

保存後、Xcodeでカスタムファイルテンプレートを選択してファイルを作成すると編集した内容が反映されています。

Sample1.swift
//
//  Sample1.swift
//  XcodeCustomTemplateSample
//
//  Created by pengtaros on 2024/12/10.
//

import Foundation

// コメントにはWhat(何が行われているか)ではなく
// Why(なぜそのような処理をしているか)を書きましょう

以上でカスタムファイルテンプレートを作成することができました。

次回予告:変数を使ったテンプレートとチーム共有

この記事では既存のファイルテンプレートからコピーしたものを編集してカスタムファイルテンプレートを作成する方法を紹介しました。
しかし、このままでは自チームのコードベースに含まれるボイラープレートコードを書く手間を削減するには少しもの足りません。
後半では、既存のファイルテンプレートをもう少し掘り下げながら変数を使ってさまざまな形のカスタムファイルテンプレートを作成する手順と、作成したカスタムファイルテンプレートをチーム内で共有する方法について紹介します。

TimeTreeの採用情報

TimeTreeでは "「誘おう」をつくる" というミッションに向かって一緒に挑戦してくれる仲間を探しています。TimeTreeで働くことに興味がある方はぜひ一度お話ししましょう✨

TimeTreeのiOS開発チームの雰囲気がわかる募集要項はこちら🍎
https://open.talentio.com/r/1/c/timetree/pages/16544

いきなり面接は…という方はコーヒーでも飲みながら気軽にお話ししましょう☕️
https://open.talentio.com/r/1/c/timetree/pages/29064

会社概要やiOSアプリエンジニア以外の募集要項はフッターにございます📝
こちらもお待ちしております🙌

TimeTree Tech Blog

Discussion