はじめに
こんにちは、へっぽこ開発者のもちです。
前回同様有識者からすれば当たり前なことしか書かない記事になるかと思います。
ただ、だからこそアプリ開発初心者や私と同じでMac初心者の方と目線の合った記事の作成ができると考えておりますので、今回も恥と外聞を捨てて初心者丸出しで頑張っていこうと思います!
(つよつよ有識者からのナレッジ共有も大歓迎です!!)
前回の記事はこちら
iOSアプリ開発をしてみて(まだしてないけど)気になったところ
1.環境
マシン:Mac mini
チップ:Apple M4
メモリ:16GB
ストレージ:256GB
キーボード:logicool MX KEYS
マウス:Apple Magic Mouse
2.アプリ開発中に気になったところ
前提として一部を除き開発環境の構築、アプリ開発はUdemyを参考にしております。
2−1.オプショナル型とは
初めて聞いた「オプショナル型」
どうやらSwiftでは「この値は存在しない可能性があるよ〜」というのを型として定義できるらしい。
オプショナル型にすることを「ラップする」と言い、書き方は以下の2種類。
var exampleInt: Optional<int>
var exampleInt: int?
そして型として定義するという前提があることから、オプショナル型を定義していないのにnil(≒null)が存在した場合、コンパイル時にエラーが発生すると。
ほーん…、つまりそういうことらしい完全に理解した。
(完全に理解したので、以下で調査していきます…笑)
2−2.そもコンパイルってなに
へっぽこぶりを存分に発揮する私が抱えている疑問は「コンパイルとは…?」です。
エンジニアになってそろそろ5年が経つというのに…
もし甥っ子に「おじさん、コンパイルってなーに」と聞かれたらえへえへ言いながらトイレに逃げることでしょう。
甥っ子いませんが。
さて、分からないで済ませるにはもったいないタイミングなので少しばかり調べてまいりました。
結論といたしまして、コンパイルとは「人が書いたソースコードを機械語に変換する」ということらしいです。
そしてコンパイルのことを調べていく中で私がコンパイルに対してふわふわしている原因がわかりました。
私コンパイルしたことなかった!!!
つまりインタープリタ言語やスクリプト言語ばかりに触れてきているため
明示的に「コンパイルをする」という操作をしたことがなかったというわけです。
…はい、ひととおり言い訳が終わったわけで、詳しくはこちらのページを見ておいてください。
https://wa3.i-3-i.info/word186.html
私レベルでもイメージできるように簡潔に書いてくださっています。
2−3.Swiftについて
話を戻しましょう。
なぜこんなにコンパイルのことに触れてきたのか、それはSwiftがコンパイル言語だからです。
ここでオプショナル型というのが活きてくるのですね。
オプショナル型を指定していない変数にnilが入っていた場合、コンパイル時にエラーになるそうです。
この厳密に型管理をするところが、Swiftが「安全な言語」と呼ばれる所以の1つらしいです。
なんだかコンパイルって旅行前に旅程を確認して、無理のあるスケジュールを指摘してくれるみたいな働きをしているんですね。
jsやpythonは「いけるやろ!」で行って「いけんかったわ!」ってなる無計画人間に見えてきました。
…私ですか?
私は無計画人間です。
2−4.ラップとアンラップ
ラップは上で少し触れましたが、オプショナル型を指定することを指します。
これは「ラップ」という言葉に「包む」という意味があることが理由らしいです。
では、アンラップとは?
包んだものを開く、つまりオプショナル型から元の型を抽出することを指します。
アンラップの主要な方法はいくつかあるそうなので次でそれぞれ紹介します。
2−5.アンラップの詳細
>まずは「強制的アンラップ」について触れます。
書き方は変数名の後ろに「!」をつけるだけで、例は以下です。
// オプショナル型の指定
var exampleInt: int? = 30
// 強制的アンラップしたexampleIntを表示
print(exampleInt!)
これはnilが入っていようがいなかろうがラップを外します。
そのため確実にnil以外が入っている状態の時のみ使います。
とUdemyに言われました。
確実にnil以外が入るならそもラップする必要がないのでは…?
→ダレカオシエテ
>次に「オプショナルバインディング」についてです。
これもアンラップの一種で、ifを使用するパターンとguardを使用するパターンがあるそうです。
①ifを使用するパターン
// オプショナル型の指定
var exampleInt: int? = 30
// オプショナルバインディング
if let unwrapedInt = exampleInt {
print(unwrapedInt)
}
else {
print("unwrapedIntはnil")
}
exampleIntにnilが入っていた場合、elseに入る
のだが、なんだかif文のあたりに違和感というか、理解しきれていない部分があり…
おそらくラップしていない変数にnilを代入しようとするとfalseになる、みたいな動きをしているのかな…?
→コレモダレカオシエテ
そして重要なところなのですが、作った定数(unwrapedInt)はifの中でしか使えません。
②guardを使用するパターン
こちらは作った定数をguardの外でも使えます。
// オプショナル型の指定
var exampleInt: int? = 30
// オプショナルバインディング
@MainActor
func Unwrap() {
guard let unwrapedInt = optionalInt else {
print("unwrapedIntはnil")
return
}
print(unwrapedInt)
}
Unwrap()
2−6.guardとは
guardとは条件に一致しなかったときに処理を中断する文法
つまり、予期していなかったことが起きたときに処理を中断するために使うもの。
ifでも同じことができるが「予期していなかったことが起きたときに処理を抜ける」という意味の処理であることはguardの方が伝わりやすいので、可読性が上がるらしい。
今はまだあまり共感できないが、Udemyが言うならきっとそうなんだろう
ちなみに@MainActorは非同期処理によるデータの競合を防ぐために
Swift5.5からリリースされた機能です。
なんとなく理解したのですが、自分の言葉にして説明しきる自信がないので、気になる方は以下のページをごらんください。
https://zenn.dev/hsylife/articles/cabbe988c648a0
3.まとめ
さて、こんなところで今回は終わりにしたいと思います。
まだまだアプリ開発ではなく、基本知識の勉強タイムですね。
Qiitaに記事を投稿することで、日頃なんとなく理解したつもりになっている部分をなんとなくのままにしないで済むのでありがたいです。
あと、新しい言語を学んでいるととても楽しいのですが
早くこの技術を使って何か作りたい欲がウズウズとしてしまいます笑
早くアプリ開発がしたいなぁ
ではまた次の投稿でお会いしましょう。
ばいばい!