AppCode 2023.1 ヘルプ

AppCode での Swift リファクタリング

このチュートリアルでは、Swift で使用できる AppCode リファクタリングツールに慣れることができます。簡単なプロジェクトで、リファクタリングを使用してコードをすばやく簡単に改善する方法を示します。途中で、AppCode で使用可能なインスペクションおよびインテンションアクションのいくつかにも慣れることができます。

始める前に

このチュートリアルの手順を繰り返すことができるようにするには、iOSConferences(英語) プロジェクトをダウンロードしてください(英語)。これは、ローカル JSON ファイルから会議のリストをロードする単純な SwiftUI アプリケーションです。AppCode で SwiftUI アプリケーションを作成するチュートリアルで、同様のアプリケーションをどのように作成したかを確認できます。次に、コードを最適化して、より簡潔で読みやすくするようにします。

メインメニューで、表示 | ツールウィンドウ | TODO を選択します。これにより、TODO ツールウィンドウが開き、リファクタリングするプロジェクト内のすべての場所を確認できます。

The TODO tool window

名前変更

名前の変更は、コードの可読性を大幅に向上させることができる、最も単純で最も頻繁に使用される操作の 1 つです。たとえば、クラス、メソッド、変数名が会社のガイドラインに準拠していないか、その機能が拡張されていることに気付いた場合に必要になることがあり、それに応じて名前を更新する必要があります。AppCode の名前変更リファクタリングを使用すると、プロジェクト全体でファイル、クラス、メソッド、変数の名前を安全に変更できます。

TODO ツールウィンドウで、Rename コメントをダブルクリックして、ContentView 構造に移動します。ContentView は、会議のリストを表示する SwiftUI ビューです。アプリケーションは 2 つのビューのみで構成されていますが、このビューの名前は間違いなくより正確である可能性があります。それでは、名前を ConferencesList に変更しましょう:

  1. キャレットを構造名に配置し、Shift+F6 を押します。または、メインメニューからリファクタリング | 名前の変更を選択します。構造名がハイライトされたら、新しい名前を入力します。

    The Rename refactoring
  2. ハイライトされたシンボルの横にある灰色の the Comments icon アイコンは、コメントおよび文字列リテラルでリファクタリングが実行されないことを意味します。このアイコンをクリックするか、Tab を押して、表示されるポップアップで、コメントと文字列チェックボックスを選択します。

    the Rename popup
  3. Enter を押してリファクタリングを実行します。これにより、ソースコード、コメント、文字列リテラルで出現するすべてのシンボルの名前が変更されます。さらに、ContentsView.swift ファイルの名前も変更されます。

  4. ここで、AppCode が構造名をどこでも変更したことを確認しましょう。Ctrl+Shift+F を押します。開いたダイアログで、App actions match case hovered をクリックして大文字と小文字を区別する検索を有効にし、古い名前 — ContentView を入力します。見つかった ContentView 出現箇所は ContentView_Previews クラスのみです。別のシンボルであるため、リファクタリングによって名前が変更されませんでした。それでも、一貫性を保つために、名前を ConferencesList_Preview に変更してください。ファイルでの検索ダイアログのプレビューで直接行うことができます。

    Edit code in preview

    ダイアログを閉じるには、外側をクリックするだけです。

  5. //TODO: Rename コメントを削除します。行全体を一度に削除するには、キャレットをその場所に置き、Ctrl+Y を押します。

変数を導入する

変数の導入リファクタリングは、コードをより読みやすく明確にしたり、複雑な構造を軽くしたり、コードの繰り返しを避けたりする場合に便利です。

TODO ツールウィンドウ(表示 | ツールウィンドウ | TODO)で、Introduce Variable コメントをダブルクリックします。これにより、loadFile() メソッドがパラメーターとして渡された List オブジェクトが表示されます。括弧の式を conferencesData という名前の変数に抽出できます。これにより、コードがより明確になり、型キャストを取り除くことができます。

  1. loadFile() メソッド呼び出しにキャレットを置き、Ctrl+Alt+V を押します。または、Ctrl+Alt+Shift+T を押してから 5 を押して、リストからリファクタリングを選択します。

  2. 括弧で式を選択し、Enter を押します。

    Select an expression to extract

    変数宣言は、List オブジェクトのすぐ上に表示されます。

  3. これで、var を使用して新しい変数を宣言するかどうかを選択し、変数型を明示的に指定できます。

    Variable options

    両方のオプションをオフのままにします。

  4. デフォルトで提案される変数名は conferences です。名前を conferencesData に変更します。

    Rename the variable

    Enter を押します。

  5. キャレットを変数宣言に配置した状態で、Alt+Shift+Up を押してこの行を body 構造体の前に置き、Ctrl+Alt+L を押してコードのフォーマットを修正します。

    Move the line and reformat code
  6. 宣言で変数の型を指定し、変数値の型キャストを削除しましょう。Alt+Enter を押して、利用可能なインテンションアクションを呼び出し、明示的な型を追加を選択します。

    Intention action

    as [Conference] を削除します。

  7. エディターの右上隅を見てください — インスペクションウィジェットがそこに表示されています。これは、AppCode が改善可能なコードを検出したことを意味します。ウィジェットをクリックして、問題ツールウィンドウを開きます。

    The weak warning

    16 行目に冗長な return キーワードがあることがわかります。これは、Alt+Enter (エディターまたは問題ツールウィンドウのいずれか)を押して冗長な「return」を削除しますを選択することで修正できます。

  8. TODO コメント(Ctrl+Y)を削除します。

シグネチャーの変更

シグネチャーの変更リファクタリングを使用すると、メソッドパラメーターとその型のセット、リターン型とスロー型、メソッドの可視性を変更できます。リファクタリングは、すべてのメソッド呼び出し、実装、オーバーライドで実行されます。

TODO ツールウィンドウ(表示 | ツールウィンドウ | TODO)で、Change Signature コメントをダブルクリックします。これにより、Data.swiftloadFile() メソッドが開きます。このメソッドは、ローカル conferencesList.json ファイルからデータをロードします。ファイル名はメソッド本体で指定されますが、パラメーターとして渡す方が理にかなっています。これを行うためにシグネチャーの変更リファクタリングを使用してみましょう:

  1. キャレットを loadFile() メソッド名に置き、Ctrl+F6 を押します。または、Ctrl+Alt+Shift+T を押してから 2 を押して、リストからシグネチャーの変更リファクタリングを選択します。

  2. 開いたシグネチャーの変更ダイアログで、the Add icon をクリックして新しいパラメーターを追加し、次のフィールドに値を入力します。

    • 内部名 : filename

    • タイプ : String

    • デフォルト値 : "conferencesData.json"

    これにより、以下のプレビューで確認できる文字列型の内部パラメーターが追加されます。

    The Change Signature dialog
  3. プレビューボタンをクリックして、リファクタリングの影響を受けるメソッドのすべての使用箇所を確認します。この場合、メソッド宣言と呼び出しの 2 つの場所があります。

    The Change Signature preview
  4. リファクタリング実行をクリックします。

  5. ここで、"conferencesData.json" のすべての出現箇所を、メソッド本体内の filename パラメーターに置き換えます。これを行うには、出現箇所の 1 つを選択し、Ctrl+Alt+Shift+J を押します。選択した文字列のすべての出現箇所にキャレットが設定され、代わりに filename と入力できます。

    Replace occurrences
  6. メソッド呼び出しに移動して、リファクタリングが正しく適用されていることを確認します。これを行うには、メソッド名にキャレットを置き、Ctrl+B を押します。loadFile() メソッドは、パラメーターとして渡された "conferencesData.json" 文字列を使用して呼び出されます。

    Changed signature in the method call
  7. メソッド宣言 Ctrl+B に戻り、TODO コメントを削除します。

メソッドの抽出

メソッドの抽出リファクタリングを使用すると、コードフラグメントを別のメソッドに移動できるため、コードを読みやすくし、重複を避け、必要に応じてコードの独立した部分を分離できます。

TODO ツールウィンドウ(表示 | ツールウィンドウ | TODO)から、最後のコメント — Extract Method を選択します。ここでは、終了日と開始日が Text 要素に表示されていることがわかります。

アプリケーション Shift+F10 を実行し、dotSwift 会議を選択すると、プログラムはこの行でクラッシュします。重要なのは、この場合の end プロパティの値は nil に等しく、オプションをアンラップしようとするとアプリケーションがクラッシュするということです。括弧の式を別のメソッドに抽出し、バグを修正するコードを追加してみましょう。

  1. 括弧の式にキャレットを置き、Ctrl+Alt+M を押します。または、Ctrl+Alt+Shift+T を押してから 6 を押します。

  2. 開いたポップアップで、抽出する式を選択し、Enter を押します。

    Select an expression to extract
  3. メソッドの抽出ダイアログで、メソッド名 — textDates — を入力し、リファクタリングをクリックします。

    The Extract Method dialog

    新しいメソッドが ConferenceDetails 構造体に表示され、抽出された式の代わりにその呼び出しが追加されます。

    The extracted method
  4. Ctrl+Alt+V conference.start.dateToString()result という名前の別の変数に抽出します。変数の導入リファクタリング Ctrl+Alt+V を使用して、次のことができます。

    private func textDates() -> String { var result = conference.start.dateToString() return "\(result) - \((conference.end?.dateToString())!)" }
  5. if let ブロックに、終了値がゼロ以外の日付を表示するためのコードを追加します。

    private func textDates() -> String { var result = conference.start.dateToString() if let end = conference.end { result = "\(result) - \(end.dateToString())" } return result }
  6. 新しく作成されたメソッドを ConferenceDetails から Conference クラスに移動し、conference 変数のすべての使用箇所を削除します。

    private func textDates() -> String { var result = start.dateToString() if let end = end { result = "\(result) - \(end.dateToString())" } return result }

    ConferenceDetails ビューに戻り、textDates()conference.textDates() に置き換えます。textDates() メソッド呼び出しがハイライトされます。カーソルをカーソルの上に置くと、エラーメッセージが表示されます。

    The error message

    クイックフィックスを適用して、メソッドを内部にします: Alt+Enter を押して、リストから対応するアクションを選択します。

    Make the method internal
  7. TODO コメントを削除します。

次は

このチュートリアルでは、人気のある Swift リファクタリングについて説明し、プロジェクトで使用する方法を示しました。Swift および Objective-C で使用可能なすべてのリファクタリングの説明は、リファクタリングセクションにあります。また、AppCode のコードインスペクションおよびインテンションアクションがコードの改善にどのように役立つかについては、コードインスペクションおよびインテンションアクションのセクションを参照してください。

関連ページ:

コードインスペクション

AppCode には、プロジェクトをコンパイルする前に、プロジェクト内の異常なコードを検出して修正する一連のコードインスペクションがあります。IDE は、さまざまな問題を見つけてハイライトし、デッドコードを見つけ、考えられるバグやスペルの問題を見つけ、全体的なコード構造を改善することができます。インスペクションは、すべてのプロジェクトファイルまたは特定のスコープでのみ(たとえば、本番コードまたは変更されたファイルでのみ)コードをスキャンできます。すべてのインスペクションには、問題がコードに影響を...

AppCode で SwiftUI アプリケーションを作成する

このチュートリアルでは、iOS 会議のリストを表示する簡単な SwiftUI アプリケーションを作成します。アプリケーションは 2 つのビューで構成されます。ローカル JSON ファイルからのデータを表す会議のリスト。各会議の詳細。その過程で、AppCode 機能に慣れ、対話的な SwiftUI プレビューを有効にする方法を学びます。ビデオチュートリアルを見て、以下のステップバイステップの手順に従ってください。ステップ 1. プロジェクトの作成:AppCode で作成されたプロジェクトは、Xc...

TODO コメント

時々、将来の参照のためにコードの一部をマークする必要があります: 最適化と改善の領域、起こり得る変更、議論される質問など。AppCode を使用すると、エディターでハイライトされ、インデックスが付けられ、TODO ツールウィンドウにリストされる特別なタイプのコメントを追加できます。この方法で、あなたのチームメイトは注意が必要な問題を追跡できます。デフォルトでは、AppCode によって認識される 2 つのパターン、とが小文字と大文字の両方で存在します。これらのパターンは行内で使用でき、サポートされ...

名前の変更リファクタリング

名前の変更リファクタリングを使用すると、コード内のシンボル、ファイル、ディレクトリへのすべての参照を自動的に修正して、シンボル、ファイル、ディレクトリの名前をグローバルに変更できます。ローカル変数またはプライベートメソッドの名前の変更は、限られた範囲のみが影響を受けるため、インラインで簡単に実行できます。クラスや public メソッドの名前を変更すると、多くのファイルに影響を与える可能性があります。この場合は、リファクタリングする前に潜在的な変更をプレビューすることをお勧めします。シンボル名を...

インスペクションを実行する

AppCode は、エディターで開かれたファイル内のコードを分析し、入力時に問題のあるコードをハイライトします。さらに、選択したファイルスコープで必要なインスペクションまたはインスペクションのセットを手動で実行できます。この場合、ファイルで検出されたすべての問題の包括的なレポートを取得します。現在のファイルの即時分析:IDE は継続的にコードをチェックし、問題を検索します。エディターの右上隅にあるウィジェットには、現在のファイルで検出された各重大度の問題の数が表示されます。ウィジェットをクリッ...

コピーして移動リファクタリング

コピー:コピーリファクタリングを使用すると、ファイルまたはディレクトリのコピーを別のディレクトリまたは同じディレクトリに作成できます。プロジェクトツールウィンドウでファイル / ディレクトリを選択します。メインメニューまたはコンテキストメニューからを選択するか、を押します。コピーウィンドウで、コピーの名前と場所を指定し、OK をクリックします。移動:移動リファクタリングを使用すると、宣言とクラスメンバーを別のファイル / クラスに、ファイル / ディレクトリを別のディレクトリに移動できます。...