🛠️

Xcode: 新規Swiftファイルを追加したときのヘッダーを変更する

2023/01/28に公開
3

Xcodeで新規Swiftファイルを追加するとヘッダーに以下のようにテンプレートの情報がコメントで書き込まれた状態になりますよね。

//
//  Sample.swift
//  SampleApp
//
//  Created by USER_FULL_NAME on 2023/01/28.
//  Copyright © 2023 ORGANIZATION_NAME. All rights reserved.
//

import Foundation

でも、プログラム中に// コメントのようにコメントを入れていて、それを全体検索しようとしたときにヘッダー情報がノイズになって嫌でした。なのでコメントの形式を以下のように変えることにしたのですが、毎回手動でやるのは嫌なので自動でなるようにしました。

/*
 Sample.swift
 SampleApp

 Created by USER_FULL_NAME on 2023/01/28.
 Copyright © 2023 ORGANIZATION_NAME. All rights reserved.
*/

import Foundation

方法

  1. 以下のパスのファイルを書き換える。(通常の.swift向け)
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/MultiPlatform/Source/Swift File.xctemplate/___FILEBASENAME___.swift

冒頭の___FILEHEADER___を消して以下のようにする。

/*
 ___FILENAME___
 ___PROJECTNAME___

 Created by ___FULLUSERNAME___ on ___DATE___.
 ___COPYRIGHT___
*/

import Foundation

  1. 以下のパスのファイルを書き換える。(SwiftUIのView向け)
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/MultiPlatform/User Interface/SwiftUI View.xctemplate/___FILEBASENAME___.swift

こちらも同様。

/*
 ___FILENAME___
 ___PROJECTNAME___

 Created by ___FULLUSERNAME___ on ___DATE___.
 ___COPYRIGHT___
*/

import SwiftUI

struct ___FILEBASENAMEASIDENTIFIER___: View {
    var body: some View {
        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
    }
}

struct ___FILEBASENAMEASIDENTIFIER____Previews: PreviewProvider {
    static var previews: some View {
        ___FILEBASENAMEASIDENTIFIER___()
    }
}

  1. 以下のパスのファイルを書き換える。(Unit Test向け)
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/MultiPlatform/Source/Unit Test Case Class.xctemplate/XCTestCaseSwift/___FILEBASENAME___.swift
  1. 以下のパスのファイルを書き換える。(UI Test向け)
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/MultiPlatform/Source/UI Test Case Class.xctemplate/XCTestCaseSwift/___FILEBASENAME___.swift

注意

Xcodes.appなどを使って複数のXcodeを管理している人はTemplatesについてはそのバージョンのXcodeごとに設定が必要。

Discussion

KyomeKyome

自分の場合、これをシェルで一発でできる様にしてみた。

.zshrc
function swift-header(){
  find /Applications/Xcode*.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/MultiPlatform -type d -depth 0 | while read line
  do
  original="\/\/___FILEHEADER___"
  custom="\/\*\n ___FILENAME___\n ___PROJECTNAME___\n\n Created by ___FULLUSERNAME___ on ___DATE___.\n ___COPYRIGHT___\n\*\/"
  sed -i "" "s/${original}/${custom}/" ${line}/Source/Swift\ File.xctemplate/___FILEBASENAME___.swift
  sed -i "" "s/${original}/${custom}/" ${line}/Source/UI\ Test\ Case\ Class.xctemplate/XCTestCaseSwift/___FILEBASENAME___.swift
  sed -i "" "s/${original}/${custom}/" ${line}/Source/Unit\ Test\ Case\ Class.xctemplate/XCTestCaseSwift/___FILEBASENAME___.swift
  sed -i "" "s/${original}/${custom}/" ${line}/User\ Interface/SwiftUI\ View.xctemplate/___FILEBASENAME___.swift
  done
}
KyomeKyome

プロジェクトのテンプレートのものも対象にするとなると

/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project\ Templates/Base/SwiftUI\ App Base.xctemplate/

の中のswiftファイルとかも変更しないといけなさそう

KyomeKyome

さらに一発で全てのSwiftテンプレートのヘッダーコメントを書き換えるシェルを考えた。

.zshrc
function swift-header(){
  original="\/\/___FILEHEADER___"
  custom="\/\*\n ___FILENAME___\n ___PROJECTNAME___\n\n Created by ___FULLUSERNAME___ on ___DATE___.\n ___COPYRIGHT___\n\*\/"
  find /Applications/Xcode*.app/Contents/Developer/Library/Xcode/Templates -type d -depth 0 |\
    xargs -Ipath find path -type f -name "*.swift" |\
    xargs -Ipath sed -i "" "s/${original}/${custom}/" path
}