１ヶ月しかないけどゆめみさんのIOSエンジニアコードチェック課題に挑んでみる

# はじめに
swiftもxcodeも使ったことないし１ヶ月しかないけどゆめみさんが気になるので[IOSコードチェック課題](https://github.com/yumemi-inc/ios-engineer-codecheck)にチャレンジしてみました．やってきたことや考えたことなどを書いていきます．Qiitaも初めて使うので拙い部分多々あります．指摘してください．
# 事前学習
何から始めれば効率がいいのか全くわからないのでとりあえず思いついたことを順番にやっていく．

__1.Swift Playgrounds__
初心者でも楽しくゲーム感覚でSwiftを遊べる．時間がたくさんあるならわかりやすく楽しく学ぶことができそう．なんとなく遠回りな気がしたので少し遊んでやめた．

__2. クイズアプリを作る__
YouTubeにて[90分でクイズアプリを作れる動画](https://youtu.be/PwmXuI8FY9Y?si=-ck06xOfP18TxdFZ)があった．Xcode情報量多すぎて正直どこを触ればどうなるのか未だに全然わからない．とりあえず触ってみようと思った．この動画一つでかなり大雑把だがXcodeを感覚的に学べた気がする．

__3. [The Swift Programming Language(日本語版)](https://www.swiftlangjp.com/)を読みまくる__
ゆめみさんはコードチェック課題をオープンにしてしまっているので一応課題に設けられている期間（１〜２週間）外でも課題を始めることができてしまう．自分が選んだリファクタリング課題のコードを見てみたが正直全く理解ができない．Swiftを１から学ぼうと思いこれを読み始める．時間はかかるがかなり勉強になる．

__4. 外部ライブラリの導入__
コードも書いたことがないのに外部ライブラリについて学び始めるのはどうなのかとも思ったが長い目で見ればいずれ学習することなので先に学んでおく．とりあえずSwift Package ManagerとCocoaPodsについて学ぶ．

__5. SwiftLintの学習__
最初に導入するべきと考えた，ルールに従ってコードを自動修正してくれるSwiftLint．実は導入まで行ったが[ルール](https://realm.github.io/SwiftLint/rule-directory.html)が多すぎてやっぱりやめることにした．デフォルトのルールのまま使用するのもどうかと思うし中途半端に学習したとしても良くない気がする．導入するのは人生レベルで本格的にSwiftを勉強すると決めた時にしよう．

# 課題を始めよう！
とりあえずIssuesを用意してくれているので一個ずつ解決していこうと思っていたが最終的にはなんとなく気になった点を直していくだけになった．

### 命名規則の変更
個人開発でもそうだがグループで開発するとなると命名規則は超大事．わかりやすさ第一で変更しよう．でもとりあえず[ChatGPT](https://chat.openai.com/)と[Bard](https://bard.google.com/chat)にぶち込んでみる．両者とも同じように命令して気に入った方の答えを採用する．対話方AIはガンガン活用するが基本的に二者に同じように命令する．
>Swift API Design Guidelineに従って下記のコードを変更して

こんな感じで命令するだけであっという間にコードが完成する．
```Swift
@IBOutlet weak var titleLabel: UILabel! //元々TtlLbl
@IBOutlet weak var languageLabel: UILabel! //元々LangLbl
@IBOutlet weak var starsLabel: UILabel! //元々StrsLbl
```
こんな感じ，めっちゃすごい
### インデントやスペースや改行を直す
面倒だがSwiftLintの導入を断念してるので一個ずつ探して直すしかない．

### 危険な強制アンラップを直す
オプショナル方なんかSwiftでしかみたことがないし新しすぎる概念だったので時間をかけて勉強したが[この記事](https://qiita.com/maiki055/items/b24378a3707bd35a31a8)がわかりやすかった．かなり丁寧に解説してくれている．暗黙的アンラップ型とオプショナル型，強制アンラップとオプショナルバインディングとオプショナルチェイニングの使い分け．まだまだ完全にはできてはいないだろうが少しずつ学んでいる．ここらへんで気づいた．

__オプショナル型について学んでいたら同時にエラーハンドリングについても学ばないといけない！大変や！__

しかもエラーハンドリングって謎に種類が多い．どうしたらいいんだ．．．

### リポジトリ型の構造体を作る
絶対あった方が便利なので思いついたうちに作っておいた．
```Swift
struct Repository: Codable {
    let full_name: String?
    let language: String?
    let stargazers_count: Int?
    let watchers_count: Int?
    let forks_count: Int?
    let open_issues: Int?
    let owner: Owner
    
    struct Owner: Codable {
        var avatar_url: String?
    }
}

struct Repositories: Decodable {
    let items: [Repository]
}
```

### その他諸々
- リポジトリの詳細表示で名前が表示されてなかったので表示，テーブルの位置を変更
- プレースホルダーを使用
- エラーハンドリングを実装
- ネスト構造を改善
- 読みやすくなるように工夫（したつもり）
- languageがnilの時の処理を変更
- アバター画像が取得できない時はデフォルトの画像を使用

# 改善点や時間があれば変更したかった点
- テストの作成

テストについて学習する時間が足りずに断念
- 外部ライブラリの導入

SwiftLintやR.Swiftを導入したかった
- アーキテクチャの適用

新しいブランチでMVPやMVC構造でのプログラムを書いてみたくて学習はしていたが学習も実装も時間が足りずに断念．学んでいる感じは面白そうだった．
- 新機能の追加

お気に入り機能の追加やいろんな数値でのソート，共有画面やUIの変更なども興味はあったが全く手付かずで終わってしまった．
- エラー改善

入力中に入力文字間をクリックしたり，入力を削除したりするとエラーが出る．実装には問題がないように思うがエラーの内容も詳しく理解できないまま終わってしまった．

- GitHubの利用

Gitも使い始めてまもないのでわからないことだらけだ．プルリクエストの使い方もわからない．コミットメッセージの書き方もぐちゃぐちゃだ．ということに終盤で気づいた．綺麗なコミットメッセージの書き方，調べたらたくさんあったのでこれからは上手なコミットメッセージを書けるようにしたい．

- 非同期処理のキャンセル

サーチバーを触った時に直前まで行っていた非同期処理をキャンセルするようにしたかったが上手くできない．そのため検索を連打すると固まる．

# 感想
新しい言語と開発環境について楽しみながら学べた良い日々だった．これからもっと新しいことに挑戦して精進していきたい．