大学入試問題をswiftで解く ~前編~

## はじめに
大学入試問題シリーズ第2弾です。

第1弾は以下を参照してください。
[大学入試問題をoctaveで解く #Octave - Qiita](https://qiita.com/reodon/items/fd0f0bd381ce92f1b886) [^1]

今回は、[Swift](https://developer.apple.com/jp/swift/) [^2] を使って解いてみたいと思います。macOS の iPhone エミュレータで動作を確認します。
本来は一つの記事にまとめたかったのですが、下記のビルドエラーに悩まされて執筆が捗らなかったため、前後編に分けました。

> the compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

本記事は前編として、作図までを実装しました。
後日公開予定の後編では、残りの面積を求める部分の実装を行い、ソースコードを公開する予定です。

## 動作環境
- macOS
  - System Version: macOS 15.2
  - Chip: Apple M1 Pro
  - Memory: 16 GB
- Xcode
  - Version: 16.2

## 入試問題
解答の対象となる入試問題です。第1弾と同じ問題です。

```math
\begin{align}
|x| + |y| - 2 & \leq 0 \tag{1} \\
x^2 + 2x - 2y - 1 & \geq 0 \tag{2} \\
\end{align}
```

```math
\begin{array}{c}
(1), (2) を同時に満たす点(x, y)の全体からなる領域を D とする。 \\
D を図示し、その面積を求めよ。 \\
\end{array}
```

### アプリでの表示
せっかくなので、アプリでも問題を確認できるようにしてみました。

![「問題」のスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501772/9fdc820f-69d2-e1ea-34b8-a7efb4f1f936.png)

WebView 内で、[MathJax](https://www.mathjax.org/) [^3] を使っています。
本来は改行しないのですが、スクリーンからはみ出さないように CSS などを駆使して無理やり改行させています。紙面の都合で、Landscape Mode のスクリーンショットを掲載していますが、Portrait Mode にすると改行されます。

## 解答
### 利用するフレームワーク・ライブラリ
- [Swift Charts](https://developer.apple.com/documentation/charts) [^4]
  - グラフを図示するために使います
  - 最新機能を利用する場合、ビルドのターゲットを iOS v18.0 以上にしないとビルドエラーになります
- [Accelerate](https://developer.apple.com/documentation/accelerate) [^5]
  - 面積を求めるための行列演算や積分で利用する予定です

### 作図
![「作図」のスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501772/043dc67e-9c55-d634-6283-99588c14c369.png)

縦横スクロール、ピンチでの拡縮に対応しています。がんばりました。

### （面積）
後編で答えを求める予定です。

## おわりに
普段は TypeScript を書くことが多いのですが、Swift は構文が特徴的だと感じました。その構文は、Ruby の[ブロック付きメソッド呼び出し](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#block) [^6] に由来しているのかもしれません。
Swift Charts は比較的あたらしい SwiftUI のフレームワークのようで、サンプルコードも少なく実装に苦労しました。
できるだけ早くソースコードを公開できるようがんばります。

## おまけ
本記事を執筆する際に役立った情報を残しておきます。

### macOS
macOS のハードウェア情報とソフトウェア情報を確認するのは、下記コマンドが便利です。

```ShellSession
$ system_profiler -detailLevel mini SPHardwareDataType SPSoftwareDataType
```

### Swift
- Swift さくっと確認したい基礎文法 [Struct(構造体)] #iOS - Qiita
  - https://qiita.com/yuinchirn/items/98b568d595650eca3334
- SwiftでRangeからArrayを取得する #Swift - Qiita
  - https://qiita.com/shoma2da/items/efe1cb6e96d95959fcdd
- Swiftの範囲型を理解する #iOS - Qiita
  - https://qiita.com/roba4coding/items/a981c7faf43555753314
- Swift で上付き文字・下付き文字を表示させる - 酢ろぐ！
  - https://blog.ch3cooh.jp/entry/ios/display_superscript_and_subscript_characters

### SwiftUI
- SwiftUIで「式が複雑すぎる」「式を分解しろ」と言われたら #Swift - Qiita
  - https://qiita.com/Hyperbolic_____/items/cf808879ef8ff04a1afb
- 【SwiftUI】フォントサイズの種類とサイズのカスタム方法 | Seeds
  - https://seeds-digital.com/swiftui-fontsize/
- 【SwiftUI】onAppearの使い方と活用方法を徹底解説！ - iPhoneアプリ開発講座｜CodeCandyオンラインプログラミングスクール
  - https://blog.code-candy.com/swiftui_onappear/
- [SwiftUI] 複数ジェスチャーのサポート (Pinch と Drag の両方をサポートする) | SmallDeskSoftware
  - https://software.small-desk.com/development/2021/06/28/swiftui-pinch-and-drag/

#### 公式チュートリアル
SwiftUI を触ったことがなかったので、勉強のために下記のチュートリアルを実施しました。

##### SwiftUI essentials
- Creating and combining views
  - https://developer.apple.com/tutorials/swiftui/creating-and-combining-views
- Building lists and navigation
  - https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation
- Handling user input
  - https://developer.apple.com/tutorials/swiftui/handling-user-input

##### Drawing and animation
- Drawing paths and shapes
  - https://developer.apple.com/tutorials/swiftui/drawing-paths-and-shapes
- Animating views and transitions
  - https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions

##### App design and layout
- Composing complex interfaces
  - https://developer.apple.com/tutorials/swiftui/composing-complex-interfaces
- Working with UI controls
  - https://developer.apple.com/tutorials/swiftui/working-with-ui-controls

##### Framework integration
- Interfacing with UIKit
  - https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit

### Xcode
コーディングが捗る設定やショートカットです。

#### Vim Mode
Editor > Vim Mode

#### インデント、コード整形
Ctrl + I

#### コメントアウト
Command + /

#### 選択行の上下移動
Command + Option + [
Command + Option + ]

### エミュレータ
#### ビルド
- Xcode: A build only device cannot be used to run this target. #iOS - Qiita
  - https://qiita.com/ishitan/items/5720949783b89d0af9d9

#### スクリーンショット・レコード
- 【ffmpeg】動画の解像度を指定してリサイズ、アスペクト比を維持したまま解像度を変更する、回転する #ffmpeg - Qiita
  - https://qiita.com/riversun/items/d09d8e596a20ec1798f3
- 【iOS Simulator】 iPhoneシミュレータのスクリーンショットを撮る方法 | アマチュア無線局JS2IIU
  - https://js2iiu.com/2024/06/15/xcode-iphone-screenshot/



[^1]: https://qiita.com/reodon/items/fd0f0bd381ce92f1b886
[^2]: https://developer.apple.com/jp/swift/
[^3]: https://www.mathjax.org/
[^4]: https://developer.apple.com/documentation/charts
[^5]: https://developer.apple.com/documentation/accelerat
[^6]: https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#block