Edited at

今年の2月から初めてエンジニアとして働き始めた私が、自身の理解を深めるため、初心者にわかりやすいようにSwiftのオプショナル型についてまとめてみた!


はじめの自己紹介および注意事項

初めまして、私は、現在24才の♂です。

諸事情により、昨年12月末に約4年間務めた国家公務員の仕事を退職し、今年の2月からとある会社で、仕事をさせていただくことになりました。

働き始めてからというもの、参考書を読んだので、ある程度構文の書き方はわかるが、実際に思ったとおりにコードが書けず、書いている間にパニクってしまい、色々な構文(仕組み?)を組み合わせてコードを描こうとすると、どう繋がっているのかが分からなくなり、自分自身がクラッシュしてしまうという問題にぶち当たりました。

その状況になると、何が分からないのかが分からない状態となってしまいます。

このままではまずいので、どうにかして早く理解するにはどうしたらいいのかと職場の方に助言を求めたところ、アウトプットしたほうがいいよと言われたため、色々調べてみたところ、初心者に教えるつもりで説明をすると、かなりの成長が見込めるということを知ったため、今回初めて、記事を書くことにしました。


注意事項


  • 超絶初心者のため、そもそも考え方が間違っている可能性がありますので、その時はご指摘をしていただければと思います。


  • また、タイトルは、初心者にわかりやすいようにと書いてありますが、そもそも私が初心者であるため、間違った正確でないことを伝えてしまう可能性があります。話半分で見てください!


では、どうぞ!


Swiftのオプショナルの学習前に初心者が理解しておいたほうがいいと思うこと!


1. プログラミングの仕組み

そもそも初心者の方は、プログラミングの仕組みを知っていますか?

ちなみに私は、知りませんでした...orz

いずれかのプログラミング言語で、書いたコードをソースコードと言いますが、それをパソコンは、そのまま理解することができないようです。

では、どのようにして理解しているのでしょうか?...一度考えてみましょう!(わからなければ一度グーグル先生に教えてもらいましょう!)

.

.

.

私が、グーグル先生から教えてもらった結果、コンパイラという言葉にたどり着き、こんな答えを見つけました!


コンパイラ (compiler)とは

人間様が分かる言葉で書いたプログラムの元ネタ(ソースコード)をコンピュータさんが分かる言葉に変換してくれるプログラムのこと...etc

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典


この↑サイトにはいつもお世話になっています。

つまり、いずれかの言語で書いたソースコードをコンピュータはコンパイラというプログラムを使って、機械語に変換して理解しているのです。


2. プログラミング言語の仕様

次にプログラミング言語の仕様についてです。

以下のサイトを参考にしてください...


コンパイラ言語とインタプリタ言語の違いを誰でもわかるように説明する【図解】

コンパイラ言語・・・ ソースコードをまとめてコンパイルする。

インタプリンタ言語・・・ 実行時に1行ずつコンパイルする。


つまり、プログラミング言語は、コンパイル型とインタプリンタ型に大別されるのです!


3. それでは、Swiftの仕様は?

これもまた

Swift (プログラミング言語)

出典: フリー百科事典『ウィキペディア(Wikipedia)』

プログラミング言語「Swift」とは?大注目言語を徹底解説!...侍エンジニア塾

を参考にしてみてください!

ここで覚えておきたことは、Swiftはコンパイラ言語ということです!


4. Nil(Null)について

ウィキペディアから引用するとnil(ニル)とは・・・


Null

出典: フリー百科事典『ウィキペディア(Wikipedia)

Null(ヌル、ナル)は、何もない、という意味で、プログラミング言語などコンピュータ関係では、「何も示さないもの」を表すのに使われる。同様のものに、nil が使われることもある。他の名前のこともある。...


となっています。

もう少しNilの安全Nilの問題その解決策などについて知ってほしいため、私が、とても参考にさせていただいた以下の記事をご覧ください。ちなみにSwiftのオプショナルについても触れられています。

べこさんという方のブログから引用させていただきました。


Null安全がすごい

「Nullチェックをコンパイラが強制する仕組み」のことです。Nullチェックをしないとコンパイルが通らない状態にすることで、実行時にNullへの不正なアクセスを防ぐ、ということをゴールとしています。



ここで初心者が、気に留めておくべきことは、2つです!

1. nilについて最新の注意を払わなければ、コンパイルが通ったものの、予期せぬnilが発生したため、クラッシュしてしまう可能性が起こってしまうということを肝に命じておく。

2. おそらくnilを扱う方法については、学習しているプログラミング言語特有の処理の仕方があるので、それについてよく理解する。

以上です。

では、やっと次から、Swiftのオプショナル型、について説明していきます!


オプショナル型とは?

オプショナル型は、前述したとおり、Swiftでnilを扱うための処理です!

それでは、説明をしていきます。

まず始めに、Swiftの変数、定数は、オプショナル型非オプショナル型の2つに分けられます。


1. 非オプショナル型の変数、定数には、nil(ある型に値がない状態を表す特別な値)が代入できない仕様になっている。


2. オプショナル型の変数、定数には、nilが代入できる仕様になっている。

なぜこのような仕様になっているのでしょうか?

長々とプログラミングの仕組み(パソコンがソースコードを理解する方法)プログラミング言語の仕様(コンパイラ言語、インタプリンタ言語)Swiftの仕様Nil(Nilの安全やNilの問題、その解決策)などについて触れてきましたが、ここでその知識が活かされます

少し考えてから次へ進んでみましょう!











では考えたということで、次に進みます。

Swiftのオプショナルは、上記のような仕様にすることにより、nilに関する処理を忘れ、コンパイルが通ったものの、予期せぬnilが発生したため、クラッシュしてしまうという、うっかりミス防ぐ狙いがあります!


そう、Swiftのオプショナルを使うことにより、nilについて然るべく適切な処理が行なわれていないと、コンパイルが通らず、エラーが発生し、人間に教えてくれるのです!


では次から実際にオプショナル型を使ってみましょう!


オプショナル型を使ってみる!

オプショナル型を使用するには、変数、定数 を定義する際、型の後ろに?をつけます。

また、値がnilになる可能性のある値のことをオプショナルバリューと言います!


例1(非オプショナル型にnilを代入する。)


var num1:Int // Int型の定数num1を定義
num1 = 1 // num1に1を代入
num1 = nil //  これは、非オプショナル型にnilを代入しようとするためエラーになる!


例2(オプショナル型にnilを代入する。)


var num2:Int? // Int?型(オプショナル型)のnum2を定義
num2 = 1
num2 = nil // エラーではなくなる!

では、それぞれの違いについてもっと知るために、それぞれ値を代入し、print文を使って出力してみます。


例3(非オプショナル型とオプショナル型を出力して確認してみる。)


var num1:Int // Int型の定数num1を定義
num1 = 1 // numに1を代入

var num2:Int? // Int?型(オプショナル型)の変数num2を定義
num2 = 1 // numに1を代入

print(num1) // 1が出力される。
print(num2) // Optional(1)が出力される。

ここで、型の後ろに?をつけることでオプショナル型になり、nilを代入できるということがわかりましたが、nil以外の値が代入された場合、その値(num2)を出力するとOptional(1)と出力されます。

これは、Int型の値(1)Optional(Int)のようにオプショナルにラップされている(包まれている)状態であると言えます。

ここで、num1num2+演算子 を合計して出力できるでしょうか?

このままでは計算して出力することはできませんが、計算をしたい場面は出てきます。そこで登場するのがアンラップという方法になります。


ここで、先ほどの例でアンラップの方法について見てみます。


例4(オプショナル型をアンラップして計算結果を出力する。)


var num1: Int
num1 = 1
var num2: Int?
num2 = 1

// print(num1 + num2) を実行すると 「1 + Optional(1)」 をやろうとしているので、エラーになる。
print(num1 + num2!)
// num2の後ろに ! をつけると強制的にアンラップ(包まれている状態ではなくなる)され、Int型のnum2が返る。
// よって答えの2が出力される。

これで無事に出力されましたが、このやり方には問題があります。

もし、num2nilが代入されていた場合どうなるでしょうか?

1 + nil なんて計算できないので、クラッシュしてしまいます。

これでは、「nilについて適切な処理が行なわれていないと、コンパイルが通らず、エラーが発生し、人間に教えてくれる」というnilの安全という大前提に準じたオプショナルの機能で対応できず、予期しないnilのエラーを引き起こす可能性があります。


こういった問題があるため、絶対に値がnilではないという確証がない限り、不用意に「!(強制アンラップ)」を使用することをしてはいけません。

ではどのようにオプショナルバリューを扱えばいいのでしょうか?

Swiftには、オプショナルバリューを安全に使う方法があります!


オプショナルバリューを安全に使う方法

オプショナルを安全に使う方法は3つです!


1. ??(Nil Coalescing)演算子を使う。


2. オプショナルバインディングを使う。


3. オプショナルチェーンを使う

この辺りについては、各自自分で調べてみてください。おそらくすぐに見つけられるはずです。

発展として、かなり詳細に説明されている記事がありましたので、余裕のある方は、こちらがとても参考になると思います。


SwiftのOptional型を極める


初めてアウトプットをして思ったこと


よかった点

オプショナルについてモヤモヤすることが多かったが、頭の中の霧が晴れたような気がする。

誰かに説明するということを念頭に置いて記事を書いたが、自分の知らないことを説明することはできないため、自分に足りていない前提知識がなんなのかを知ることができたと思う。

また、初心者は、何故?を意識すると自分の中で欠けている知識が何であるかを知ることができ、それを学ぶことにより何が分からないのかが分からないという問題を解消していけるのではないかなと思いました。


反省点

記事を書くことが初めてだったためなのか?前提知識が欠けていたからなのか?めちゃくちゃ時間を消費してしまい、アウトプットのために記事を書くのに数時間かかってしまった...

タダでさへ覚えなければいけけないことなどが多いのに、こんな時間をかけてしまっては、早く成長したいという目的のためにやっているのに時間が足りなくなり、結果的に、他に手が回らなくなり、成長を阻害してしまう気がするので、これからは、はしょれるところははしょって、時間効率を意識して簡潔に書くことを心がけたい。


これからについて

いつになったらコードが書けるようになるのかわかりませんが、なるべく早く書けるようになるため、アウトプットを積極的にしていきたい!


目標は、月1!いや、2週に1回! 頑張ります!


「ここをこうした方がいいよ」とか「間違っているよ」とか教えてくれるとありがたいです!よろしくお願いします!

  • Swiftのオプショナルの学習前に初心者が理解しておいたほうがいいと思うこと!
  • ここで初心者が、気に留めておくべきことは、2つです!
  • オプショナル型とは?
  • オプショナル型を使ってみる!
  • ここで、先ほどの例でアンラップの方法について見てみます。
  • こういった問題があるため、絶対に値がnilではないという確証がない限り、不用意に「!(強制アンラップ)」を使用することをしてはいけません。
  • オプショナルバリューを安全に使う方法
  • 初めてアウトプットをして思ったこと