🐥

Xcodeの便利なTips7選

2024/05/14に公開

Xcodeで最近知って便利だと思った機能を紹介しよう!
と思ったら、4つ紹介して終わりになったので、水増しで前から知ってたものを3つくっつけました。

1. 開いたタブを上書きしない

Xcodeのデフォルト設定だと、開いたタブが残ったり消えたりすることがあって、すごくイライラしていました。
設定を変えると、「常に新しいタブで開く」もできるんですけど、
なるべくデフォルト設定でやりたい派の人間なので、設定は変えたくないなと悩んでいました。

この挙動なんですが、どうやらタブに通常タブとは別に一時タブ(Temporary Tab)のようなものがあるようです。
ファイル名がイタリック表記されているとき、そのタブは一時タブ扱いで、次に別のファイルを開くと上書きされます。

この上書きを防ぐ方法ですが、ファイル名をダブルクリックすると、一時タブから通常タブ扱いになります。
また、ファイル名を右クリックして、「Keep Open」でも同じことができます。

2. 今開いているタブ以外を全部閉じる

リファクタリング中などに、たくさんのファイルを数行だけ変更する作業が発生します。
このときは逆にタブが開きすぎるので、一斉に閉じたいときがあります。

今開いているタブ以外を全部閉じるショートカットとメニューがあります。

ショートカット: ⌘ + Alt + w
ファイル名を右クリック: Close Other Tabs

3. ブックマーク

Xcode 15からの変更で、コード中の任意の行をブックマークできるようになってました。

以前はファイル中の戻りたいところに、目印としてブレイクポイントやコメントを使ってたんですが、それがブックマーク機能で代用できそうです。
でも正直あんまり使ってません……

4. 色々なRename

XcodeはRename機能がいくつかあります。
4つ紹介します。

4-1. 検索して手で置換

一番原始的なRename方法は、変更したいワードで検索かけて、置換していく方法です。

4-2. Edit All in Scope

任意の変数名・関数名を右クリックしたメニューで、「Edit All in Scope」を選択すると、
ファイル内の同名のものをRenameできます。
「スコープ内の全編集」なので、ファイルを超えたRenameは効きません。

4-3. Refactor > Rename

右クリックして出てくるメニューで、「Refactor > Rename」を選ぶと、プロジェクト全体のRenameができます。
変数・関数を参照している方のRenameも効くので、すごいです。
すごいですが、時間かかるのと、バグってる場合があるのがキツいです。

何回か使ったんですが、挙動が信用できなさすぎて、今は使っていません。
Edit All in Scopeの方がまだ好きです。

4-4. サイドバーの検索タブを使った置換

ここまでは結構みんな知ってるんじゃないかと思う機能でしたが、ここからが最近発見したRename方法です。
サイドバーの検索タブありますよね。

ここで実は置換が効きます。

Findをクリックすると、こんな選択肢が出てきます。

Replaceを選ぶと、このようにプロジェクト単位・ターゲット単位の文字置換が効きます。
これを利用したRenameができます。
Xcode付属のRename機能の挙動があやしいので、修正内容によっては、こっちを使う方が早いと思います。

僕は以前に会社でかなり機械的な置換作業をしていて、XcodeのRename機能だと参照関係の検索でハングして動かなかったんですが、
このサイドバーの置換ができることに気づいて救われました。

Rename機能まとめ

3つ紹介しました。
それぞれのユースケースについて、簡単にまとめます。

Edit All in Scope: ファイル内の一斉置換をかけたいとき
Refactor > Rename: プロジェクト内の一斉置換がかけられる。参照箇所が少なければ使っていいと思う
検索タブ: (参照関係は見ていないが)プロジェクト内の一斉置換がかけられる。文字列の完全一致が必要だが、そこが保証できればRename機能より結果が安定

5. メンバーワイズイニシャライザの自動生成

メンバーワイズイニシャライザを書かないといけない場面がたまにあるかと思います。
Swiftの構造体は暗黙的にメンバーワイズイニシャライザが生成されますが、別ターゲットからアクセスしようとするとイニシャライザにアクセスできないので、明示的に書く必要があったりします。

public struct Sample {
    public let a: String
    public let b: String
    public let c: String
}

たとえばこんな構造体を例とします。
Refactor > Generate Memberwise Initializer と選んであげると、

public struct Sample {
    internal init(a: String, b: String, c: String) {
        self.a = a
        self.b = b
        self.c = c
    }
    
    public let a: String
    public let b: String
    public let c: String
}

こんなイニシャライザを生成してくれます。
あとはイニシャライザをpublicにしてあげれば、ターゲット外からもアクセスできます。
プロパティの数が多くなればなるほどありがたさが増します。

6. ブレイクポイントでprintする

printデバッグってついついやってしまいますが、print消し忘れてコミットしてしまうこともよくあるので、
できればエディタの力でやりたいですよね?
ということで、そんな機能があります。

ブレイクポイントを右クリックして、Edit Breakpointを選択します。

色々できるんですが、デバッグ中に変数の中身出したいときは、Add Actionを選んでください。
選択肢の中から、Debugger Commandを選ぶと、LLDBのコマンドが効きます。

po someみたいなコマンドが効くので、これでソースの変更なしにprintデバッグと同じことができます。

ただブレイクポイントで止めて、コンソールからpo someと入れても同じなので、正直僕はそっちを使っています。
たまにブレイクポイントで上手く参照できないときがあって、そのときはprint文書いています。
(紹介しておいてなんですが)

7. インデントの自動調整

この前Claudeに出力してもらったコードをXcodeにコピペしてたんですが、
なぜかインデントをスペース3つで出してて、困りました。

そういうときにXcodeのインデントの自動調整が便利です

Ctrl + i

これで選択している行のインデントが調整されます。
ファイル全体を選択した状態でCtrl + iしてやると、ファイル全体です。

デフォルトのインデントの数は4スペースです。

もしデフォルトを変えたい場合、ここで設定できます。
あと改行にもスペース4つを入れてそろえてきます。
Lintで改行は何も入れない設定だったりするとジャマになります。

まとめ

Xcodeの便利なTips7選でした。

(了)

Discussion