SwiftUIのプレビューが動かなくなった時の対処方法

# 本記事について
Xcode Previewsで起きたエラーの対処をメモする。

## 起きたこと
プレビューを実行すると途中でクラッシュしてしまい、以下のエラーメッセージが表示される。

```
CrashOnLaunchError: [あなたのプロジェクト名] app crashed on launch

The app [あなたのプロジェクト名] crashed while updating the preview. Look for crash logs in ~/Library/Logs/DiagnosticReports for more details.
```

## 結論
以下の記事に記載されている`xcrun simctl --set previews delete all`で対処できた。

> Swift UI Preview Crash - https://developer.apple.com/forums/thread/661669?answerId=635975022#635975022

## やったこと（ログ的な）

そこでDiagnosticReportsを見てみる。

```
$ cd ~/Library/Logs/DiagnosticReports
```

以下のようなファイルがあるので、このログを見てみる

```
$ cat postgres_2021-09-24-114053_⚪︎⚪︎⚪︎⚪︎MacBook-Pro.crash
```

```
Dyld Error Message:
  dyld: Using shared cache: 4A889CE9-8D7E-304E-A5F7-84D819B0BF9C
Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.67.dylib
  Referenced from: /usr/local/opt/postgresql/bin/postgres
  Reason: image not found
```

既視感のあるエラーだが、いまいち対処法が見つからないので、ネットで検索する。

そうすると、以下の記事を見つける。

> Swift UI Preview Crash - https://developer.apple.com/forums/thread/661669?answerId=635975022#635975022


記事に記載されている、以下のコマンドを打つと、解消できた。

```
$ xcrun simctl --set previews delete all
```

## `xcrun simctl --set previews delete all` って何？？

理解が浅いので、なるべく一つ一つ調べて理解してみた。

### xcrun
XcodeのCLIツール
指定されたコマンドラインツールを探して実行してくれる。

### simctl
主にシミュレータの管理を行うための機能を持っている。

サブコマンドは以下の通り。

```
usage: simctl [--set <path>] [--profiles <path>] <subcommand> ...
       simctl help [subcommand]
Command line utility to control the Simulator

For subcommands that require a <device> argument, you may specify a device UDID
or the special "booted" string which will cause simctl to pick a booted device.
If multiple devices are booted when the "booted" device is selected, simctl
will choose one of them.

Subcommands:
	create              Create a new device.
	clone               Clone an existing device.
	upgrade             Upgrade a device to a newer runtime.
	delete              Delete specified devices, unavailable devices, or all devices.
	pair                Create a new watch and phone pair.
	unpair              Unpair a watch and phone pair.
	pair_activate       Set a given pair as active.
	erase               Erase a device's contents and settings.
	boot                Boot a device or device pair.
	shutdown            Shutdown a device.
	rename              Rename a device.
	getenv              Print an environment variable from a running device.
	openurl             Open a URL in a device.
	addmedia            Add photos, live photos, videos, or contacts to the library of a device.
	install             Install an app on a device.
	uninstall           Uninstall an app from a device.
	get_app_container   Print the path of the installed app's container
	install_app_data    Install an xcappdata package to a device, replacing the current contents of the container.
	launch              Launch an application by identifier on a device.
	terminate           Terminate an application by identifier on a device.
	spawn               Spawn a process by executing a given executable on a device.
	list                List available devices, device types, runtimes, or device pairs.
	icloud_sync         Trigger iCloud sync on a device.
	pbsync              Sync the pasteboard content from one pasteboard to another.
	pbcopy              Copy standard input onto the device pasteboard.
	pbpaste             Print the contents of the device's pasteboard to standard output.
	help                Prints the usage for a given subcommand.
	io                  Set up a device IO operation.
	diagnose            Collect diagnostic information and logs.
	logverbose          enable or disable verbose logging for a device
	status_bar          Set or clear status bar overrides
	ui                  Get or Set UI options
	push                Send a simulated push notification
	privacy             Grant, revoke, or reset privacy and permissions
	keychain            Manipulate a device's keychain
```

### `--set previews delete all`

残りのオプションはおそらく、previewsというpathを指定して、previewsのデータ（キャッシュ？）を全て削除しているという認識。