Xcode 11.0で追加された便利機能まとめ

この記事は、[NTTテクノクロス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ntt-tx) 13日目です。

NTTテクノクロスの神長です。
社内では、モバイル向けアプリ開発の技術支援、ノウハウ記事の執筆、[社内研修講師](https://www.ntt-tx.co.jp/products/soft_dojyo/?utm_source=qiita&utm_medium=ac2019&utm_campaign=13)等を担当してます。

また、2018年から、地域の小学生を対象にした[プログラミング教育](https://www.ntt-tx.co.jp/corporate/csr/csr06.html#04/?utm_source=qiita&utm_medium=ac2019&utm_campaign=13)も行なってます。

# はじめに

本記事では、「Xcode 11.0で追加された便利機能まとめ」と題し、 **簡単且つ、直ぐに使える！便利な機能** をPick upして紹介します。

- エディタ関連
- 管理関連
- テスト・デバック関連

# Xcode 11.0の便利機能

## エディタ関連
### inline code diffs

inline code diffsは、ローカルファイルのコードの変更前後の箇所をわかり易く明示する機能です。
ここでは、以下項目を説明します。

- 表示
- 非表示
- 変更の取り止め

#### 表示

ソースコードから`print("Sample")`を削除した場合を例に、表示の説明をします。

``` swift
override func viewDidLoad() {
    super.viewDidLoad()
    print("Sample")
}
```

- チェンジバーをクリックし、以下のメニュー画面を表示後、 **「Show Change」** を選択します。

<img width="200" alt="01_Inline_Code_Diffs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/2cba8aa3-7742-2ac0-e0fe-8fb0c8cf0fc3.png">

- 以下のように、変更箇所が表示されます。

<img width="200" alt="02_Inline_Code_Diffs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/eae4050e-54d6-e2bb-5c51-4ba21c32a5ad.png">

#### 非表示

- チェンジバーをクリックし、以下のメニュー画面を表示後、 **「Hide Change」** を選択します。

<img width="200" alt="03_Inline_Code_Diffs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/91f0b233-5c9c-dc70-38fd-c4c74cbe269b.png">

#### 変更の取り止め

- 変更の取り止めを行う場合、チェンジバーをクリックし、以下のメニュー画面を表示後、 **「Discard Change」** を選択します。

<img width="200" alt="04_Inline_Code_Diffs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/cc3a2071-1664-a9d0-60da-5ed14426c3bc.png">

- 実行後、コードが変更前の状態に戻ります。(削除したコード(print("Sample"))が元に戻る場合を掲載してます。)

<img width="200" alt="05_Inline_Code_Diffs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/eac35749-d60c-be33-e556-4b8b98339dbe.png">

### Spell Checking

Spell Checkingは、ソースコード内の誤字を検出。検出した誤字の修正ができる機能です。
ここでは、以下項目を説明します。

- オープン中のファイルに対して、スペルチェック
- 自動的にスペルチェック
- スペル候補の表示

#### オープン中のファイルに対して、スペルチェック

以下操作を行うことで、オープン中のファイルに対してのスペルチェック(変数、関数、クラス等)が行えます。

##### Check Document Now

- Xcodeのメニューから、 **「Edit > Format > Spelling and Grammar > Check Document Now」** を実行します。

<img width="400" alt="01_Spell_Checking.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/cbfb7343-ad31-fbb1-fc1b-d852ab02751e.png">

- 誤り箇所が、以下のようにハイライトされます。

<img width="400" alt="02_Spell_Checking.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/6c1dd492-0baf-c497-90d1-9242ec8aa6d8.png">

##### Show Spell Checking and Grammar

- Xcodeのメニューから、 **「Edit > Format > Spelling and Grammar > Check Document Now」** を実行します。

<img width="400" alt="03_Spell_Checking.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/579c9882-90bb-f97e-902e-50bb82da7770.png">

- 誤り箇所の修正、修正候補が表示される画面が表示されます。
  青枠箇所に変更を行いたい文字を入力後、 **Changeボタン** を押下することで、誤った文字の修正が行えます。

<img width="400" alt="04_Spell_Checking.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/f074ec88-9c4e-290b-282a-1888b8ff1bee.png">

#### 自動的にスペルチェック

以下操作を行うことで、コード記述時に自動的にスペルチェックが行われます。

- Xcodeメニューから、 **「Edit > Format > Spelling and Grammar > Check Spelling While Typing」** を実行します。

<img width="400" alt="05_Spell_Checking.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/7fdfb4ee-2057-bf07-e3f7-1a28548e9f2d.png">

#### スペル候補の表示

以下操作を行うことで、正しいと考えられるスペルの候補が表示されます。

- **誤り箇所を選択→右クリック** を実行します。

<img width="250" alt="06_Spell_Checking.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/7cfb0dd0-5a57-69fb-139b-0add807ce1e4.png">

### Mini Map

Mini Mapは、すばやく任意のセクションに移動したり、マウスオーバーで関数名を表示する等、ソースコードの読み込みを行う際の生産性が向上が期待できる機能です。ここでは、以下項目を説明します。

- 起動
- 停止

#### 起動

Xcodeメニューから、以下操作を行うことでMini Mapを起動できます。

- **Editor ＞ Minimap** を実行します。

<img width="150" alt="01_Mini_Map.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/030a24ef-e00a-af28-1c25-d29ece820671.png">

- 実行後、エディターの右上にMini Mapが出現します。
  マウスオーバーすることでコード内の構成の閲覧が行え、クリックすることで任意のセクションへの移動が行えます。

<img width="150" alt="02_Mini_Map.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/3df9e63e-5e9b-7e8d-976f-6c13f54939cd.png">

　また、Mini Mapを表示中に検索を行なった場合、検索内容と一致する部分がMini Mapにも反映され、エディタ上で選択中の箇所が強調表示されます。

<img width="450" alt="04_Mini_Map.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/48ecc83b-e804-eef7-5a57-05048ffee683.png">


#### 停止

Xcodeメニューから、以下操作を行うことでMini Mapを停止できます。

- Minimapにチェックがついている状態で、 **Editor ＞ Minimap** を実行します。

<img width="150" alt="03_Mini_Map.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/b3014cfe-c9b0-9cfb-088d-09cf8c568a13.png">

### Documentation function

以下の機能を説明します。

- Edit All in Scope
- Add Documentation

なお、本機能は、任意のコードを選択した状態から、 **Commandボタン＋クリック** で起動します。

起動すると以下のメニュー画面が表示されます。

<img width="200" alt="01_Documentation.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/9dcd0d5a-c698-e79d-209c-f94156c5945d.png">

#### Edit All in Scope

Edit All in Scopeは、コード上で選択した定義を全選択、同時編集可能な状態にする機能です。

同一定義を一括で編集する場合の効率アップ、人的ミスの派生を防止することができます。

![03_Documentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/be9eb7ca-0a61-1847-becc-32cfe631023d.png)

#### Add Documentation

実行箇所に、ドキュメンテーションコメントの雛形を挿入する機能です。

![04_Documentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/02d3e6d7-9538-b980-f68f-b473926da1eb.png)

また、関数に引数を追加した後に、当該機能を実行すると追加した引数のドキュメンテーションコメントの雛形を追加します。

![05_Documentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/9d57a8a0-30c0-ff2d-c1a7-a49ac12c3f07.png)

## 管理関連

管理関連として、以下の機能を説明します。

- パッケージ管理(Swift Package Manager)
- 構成管理(Gitコマンド)

### パッケージ管理(Swift Package Manager)

Swift Package Managerとは、CocoaPodsやCarthageと同じように、パッケージの依存関係を解決し、プロジェクトで利用できるようにするパッケージ管理ツールです。

このSwift Package Managerが、Xcode 11.0からXcodeの機能として利用できるようになりました。
Xcode 11.0が登場するまでは、Swift Package Managerは、macOS、Linuxのターミナル上で実行するアプリやサーバーサイドのプログラム等に利用されてきましたが、Xcode 11.0からは、iOSアプリのプロジェクトでも使えるようになりました。

ここでは、以下項目を説明します。

- 事前準備
- パッケージの追加
- パッケージの削除

#### 事前準備

事前準備として、以下設定を行います。

- Preference…のAccountsにGitHub等のパッケージ取得先のアカウントを追加します。

<img width="400" alt="01_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/cd51a682-8cee-d01b-74ea-ef1a3380a6f5.png">

#### パッケージの追加

以下操作でパッケージを追加できます。

- Xcodeメニューから、 **File＞Swift Packages＞Add Package Dependency** を実行します。

<img width="250" alt="02_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/6f1683d9-6acd-0238-c64a-192fc94770a2.png">


- 以下画面が表示されるので、画面上段の検索フィールドにインポートするパッケージの名称を入力後、パッケージが表示されるので、選択後、Nextボタンを押下します。

<img width="350" alt="03_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/42f776a4-232e-fed3-292a-0bdc537c4001.png">

- 以下画面が表示されるので、Version/Branch/Commitの何かを選択し、Nextボタンを押下します。

<img width="350" alt="04_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/3fbc91c8-a51c-6447-40c5-30285f3e60dc.png">

- 以下画面が表示されるので、Finishボタンを押下します。

<img width="350" alt="05_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/220b09a1-5763-7dc9-a72a-c8b8206e0dfb.png">

- プロジェクトツリーに、パッケージが追加されていることを確認します。

<img width="250" alt="06_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/efdbc8b8-0624-742a-7e4c-2724e2b14340.png">

- 最後にパッケージを利用したいコードに定義します。

<img width="200" alt="07_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/9e7ab911-9577-1fff-6910-ed0026405a0e.png">

#### パッケージの削除

取得したパッケージを削除する場合は、以下操作を行ってください。

- Projectの **Swift Packages** を開きます。

<img width="400" alt="08_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/c25dd5e2-ec05-7525-3e56-ea25f94f09c2.png">

- 削除したいパッケージを選択し、-ボタンを押下すると、以下画面が表示されるのでRemoveボタンを押下します。

<img width="400" alt="09_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/3bbaa50a-0c40-6208-7f59-48d2ba679001.png">

- プロジェクトツリーからパッケージが削除されていることを確認します。

<img width="400" alt="10_SPM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/024f482b-bc01-2fa3-c6c1-44cd63d0deae.png">

### 構成管理(Gitコマンド)

Xcode 11.0から、Xcodeで利用できるGitコマンドに、以下コマンドが追加されました。
ここでは、各コマンドの詳細を説明します。

- Stash Changes…
- Cherry-Pick…

#### Stash Changes…

Stash Changes…とは、commitしていない変更を一時退避できる機能です。
利用方法は、以下の通りです。

- Xcodeメニューから、 **Source Control＞Stash Changes…** を実行します。

<img width="175" alt="01_Git.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/fdfb15e2-816e-f0b6-18f0-488301772b45.png">

- 以下の画面が表示されるので、必要に応じて後で参照できるように、変更の説明を入力します。入力後、Stashボタンを押下します。なお、入力した説明は、ソース管理ナビゲータに表示されます。

<img width="250" alt="02_Git.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/0aa9f16d-ff0b-f7e5-5247-84e15f259ad9.png">

#### Cherry-Pick…

Cherry-Pick…とは、別ブランチでのcommitを反映できる機能です。

利用方法は、以下の通りです。

- Xcodeメニューから、 **Source Control＞Cherry-Pick…** を実行します。

<img width="175" alt="03_Git.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/ba1128c9-ade6-7987-865e-ee99f22c0a90.png">

- 以下の画面が表示されるので、必要に応じて後で参照できるように、変更の説明を入力します。
入力後、Cherry-Pickボタンを押下します。なお、入力した説明は、ソース管理ナビゲータに表示されます。

<img width="225" alt="04_Git.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/3b3ed4f5-1b1d-5fdb-647a-eb5201223ffa.png">

## テスト・デバック関連

テスト・デバック関連として、以下の機能を説明します。

- Device Conditions
- Environment Overrides
- Debugging SwiftUI View Hierarchies

### Device Conditions

Device Conditionsとは、Xcode 11.0から追加された端末の発熱状態をシミュレートする **「Thermal state condition」** と端末の通信状態をシュミレートする **「Network link condition」** の2機能を指します。

Xcode 11.0リリース以前は、デバイスの状態に関わるテスト・デバックには、端末の利用が必須でしたが、Xcodeで設定を行い、テスト・デバックができるようになりました。

ここでは、この2機能の説明をします。

- Thermal state condition
- Network link condition

#### Thermal state condition

Xcode 11.0から、端末の発熱をシミュレートする「Thermal state condition」が実装されました。

この機能の最大のメリットは、 **端末(実機)を実際に発熱させることなく、温度の変化によるアプリの動作をテスト・デバックできる点** です。

この機能は、Xcodeメニューより、以下の操作を行うことで、利用できます。

- Window＞Devices and Simulatorsを実行します。

<img width="175" alt="01_TEST_DEBUG.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/52353b32-1fd5-091e-f481-09fa7b1f3235.png">

- 以下の画面が表示されるので、 **「Condition」に「Thermal State」** を設定し、 **「Profile」に以下3種の何かの状態** を設定する。

##### Profile詳細

- Fair:やや高い。
- Serious:高い。
- Critical:非常に高い。

<img width="400" alt="02_TEST_DEBUG.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/29fedecb-753a-deaf-f27f-0941d3c05649.png">


- 設定完了後、startボタンを押下します。

#### Network link condition

Xcode 11.0から、端末の通信状態をシュミレートする「Network link condition」が実装されました。

この機能の最大のメリットは、 **直接端末の通信状態をシュミレートし、通信状態の変化によるアプリの動作をテスト・デバックできる点** です。

 この機能は、Xcodeメニューより、以下の操作を行うことで、利用できます。

- Window＞Devices and Simulatorsを実行します。

<img width="175" alt="01_TEST_DEBUG.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/52353b32-1fd5-091e-f481-09fa7b1f3235.png">

- 以下の画面が表示されるので、 **「Condition」に「Network Link」** を設定し、**「Profile」に以下の何かの状態** を設定します。

##### Profile詳細

- 100% packet loss
- Very poor network
- Edge Network - poor
- Edge Network - average
- Edge Network - good
- Edge Network - best
- 2G Network - poor
- 2G Network - better
- 3G Network - average
- 3G Network - good
- 3G Network - bet
- LTE Network
- WiFi Network
- WiFi Network (802.11ac)
- DSL Network
- High Latency DNS

<img width="400" alt="03_TEST_DEBUG.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/9cf47db1-840a-95e5-d805-ec62a358ece2.png">

- 設定完了後、startボタンを押下します。

### Environment Overrides

Xcode 11.0より、デバック領域に「Environment Overrides」が実装されました。

この機能の最大のメリットは、 **実機、シミュレータに対して、表示に関する設定やアクセシビリティの設定の変更をリアルタイムに反映できる点** です。
この機能を活用することで、設定変更時のアプリのレイアウト崩れを確認するテスト等の生産性を向上させることができます。

この機能は、以下の操作を行うことで利用できます。

- デバック領域にあるEnvironment Overridesボタンを押下します。
- 以下の画面が表示されることを確認します。この画面より、各種設定の変更を行うことができます。

<img width="300" alt="04_TEST_DEBUG.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/e037736c-5faa-0a41-ef8a-3098743ef77a.png">

### Debugging SwiftUI View Hierarchies

iOS13からのSwiftUIサポートに伴い、Xcode 11.0よりDebug View HierarchyもSwiftUIの対応がなされました。

これにより、Debug View Hierarchyの画面でSwiftUIのコンポーネント毎の情報が、インスペクタに表示されるようになり、SwiftUI実装時、リアルタイム且つ、コンポーネント単位の確認が行えるようになりました。

なお、Debug View Hierarchyの画面は、デバック領域にあるDebug View Hierarchyボタンを押下することで表示できます。(イメージ内の赤枠箇所)

<img width="350" alt="05_TEST_DEBUG.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59827/33249914-4e37-5e97-4e2f-a71ac7e2f441.png">

# 参考・引用

以下のサイトを参考に記事を執筆しました。

- [Xcode Release Notes](https://developer.apple.com/documentation/xcode_release_notes/)
- [What's New in Xcode 11](https://developer.apple.com/videos/play/wwdc2019/401/)

また、引用したソースコードの一部(SwiftUI関連)は、以下のサイトで公開されているソースコードを引用してます。

- [SwiftUI  Tutorials(Creating and Combining Views)](https://developer.apple.com/tutorials/swiftui/creating-and-combining-views)

# おわりに

最後まで読んで頂き、ありがとうございます。

私が、初めてXcodeに触ったのは、今から3年前でした。
今日までに、様々な機能の追加・改善がなされ、年々使い易くなってゆくため、毎年のバージョンアップが楽しみです。

今回は、Xcodeに焦点を当てた記事を執筆しましたが、今後は、iOS、Swift、[プログラミング教育](https://www.ntt-tx.co.jp/corporate/csr/csr06.html#04/?utm_source=qiita&utm_medium=ac2019&utm_campaign=13)を行う過程で得た知見・ノウハウ等の記事も公開できればと考えてます。

それでは、[NTTテクノクロス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ntt-tx)の14日目にバトンタッチします。

引き続き、お楽しみください。