【Swift講義③】オプショナル型(!?)の理解

その他
カテゴリ検索

前回はデータ型について説明しました。

【Swift講義②】データ型の理解
Swiftはデータ型(Data Type)に厳格な言語であり、データ型を理解せずしてコードを書くのは難しいです。 前回はデータ型を紹介するために、クラス・インスタンス・プロパティ・メソッドについて解説しました。 ...



今回は、オプショナル型について説明したいと思います。

 

オプショナル型・非オプショナル型とは

 

まずはこの辺の記事を読みやすくするために、構造を図にしてみました。



まず理解すべきはnil

 

他の言語ではnullなどと称されることもありますが、Swiftでのnilも他の言語におけるnullと同様、データがない空の状態を示します。

 

このnilを許容するかしないか(仮にnilが出てしまっても処理を続けるかどうか)の違いが、オプショナル型と非オプショナル型の違いになっています。

 

ちなみに、Optionalという英単語の意味は「選択」という意味があり、nilを許容するかしないかを選択する作業ともいえるでしょう。

非オプショナル型とは

非オプショナル型とは、nilを許容するかどうかを選択しない、すなわち、nilを許容しないデータ型のことです。

具体的には、

// nameというString型の変数を定義
// このように通常のデータ型の指定方法(!?どっちもなし)が非オプショナル型

var name: String

// 画面に変数を出力(呼び出してみる)
print name

これを見て何をしているかわからない人は前回のも見てね

【Swift講義②】データ型の理解
Swiftはデータ型(Data Type)に厳格な言語であり、データ型を理解せずしてコードを書くのは難しいです。 前回はデータ型を紹介するために、クラス・インスタンス・プロパティ・メソッドについて解説しました。 ...

 

さてこの作業ではエラーが出てしまいます。

いつもの(!?両方つかない)のデータ型の宣言方法が非オプショナル型の宣言方法なのですが、こちらはnilを許容しません

すなわち、宣言する変数には必ず値が入っていないといけません

しかし、こちらのappleという変数はString型であると宣言されただけで、値が入っていないのです。

つまりこの時点では変数appleはnilであるといえ、その結果非オプショナル型の変数appleは実行不可能となります。



オプショナル型

こちらは先程の非オプショナル型とは異なり、nilを許容させることができます

そもそもなぜnilを許容する必要があるのかというと、ユーザが任意に設定する項目(ラインでいうプロフィール画像)などは、ユーザによって入力されない可能性がある、すなわちnilになる可能性があるため、そのような項目についてはオプショナル型でないとエラーが起きてアプリが正しく動作しないことになるからです。

 

オプショナル型の宣言は、を使って行います。

すなわち、!か?がついていれば、それらはオプショナル型であるといえますね。

まとめるとこんな感じ。

// オプショナル型での宣言

var apple: String?
var orange: Int!

// 参考 非オプショナル型での宣言

var berry: String

 

!と?の違い

ではどっちもオプショナル型にしても!と?の違いは何だろう。

一般的に、オプショナル型といえばのほうを指し、暗黙的アンラップ型と呼ばれるオプショナル型です。

この辺は今のところはわからなくてよいです。

強く言いたいのは、オプショナル型と非オプショナル型は全くの別物だということです。

例えば、

// オプショナル型(一般的には?がついたもの)の数字

var numberA: Int? = 5

// 非オプショナル型の数字

var numberB: Int = 3

// この二つの数字を足し算してみる

var sum = numberA + numberB    // エラー

なぜエラーが出るのかというと、オプショナル型の数字はOptional(5)であるのに対し、非オプショナル型の数字はであるからです。

 

先ほども言いましたが、ただの数字に見えるようで、実はオプショナル型の数字はOptional(数字)という風に出力されるため、これらは普通の数字とは明確に異なります

 

なので、いつものように足し算することはできず、エラーが出てしまいます。

 

ここで使うのがアンラップという概念です。



アンラップとは

ラップという英単語の意味は、包み紙という意味です。

先程述べたOptional(5)ですが、これ、5がOptional()に包まれてますよね。

しかし、包まれたままでは次の処理ができない可能性があるため、普通の関数に入れて処理しようとするなどの場合には包み紙をはがす(アンラップする)必要があります。

 

そのアンラップの方法の一つに、暗黙的アンラップというものがあります。

暗黙的というのは半ば自動的にともいえますよね。

そうなんです。!を使ったオプショナル型というのは、自動的にアンラップしてくれるものなのです。

具体的には、先程?を使ったオプショナル型ではエラーが出てたあのコードが、、、

var numberA: Int! = 5
var numberB: Int = 3

var sum = numberA + numberB // 結果 8

こんな風に、正常に動作するようになります。

?ではアンラップされずにOptional(5)となるのに対し、!ではnilの可能性がある項目が一旦Optional(5)の形で代入された後、勝手(暗黙的に)にアンラップされて5という普通の数字してもらえるのです。

最初のうちはこれらの使い方を間違えると思いますが、Xcode側がしっかり注意してくれるので、自分のやりたい処理に合わせて随時変更していきましょう。
独学での勉強に限界を感じたら、プログラミングスクールに通うという手もあります。

<Udemy>

管理人が勤務している大手会計事務所でも導入されており、その他ソフトバンクなど超大手企業でも導入されているオンライン学習サービスです。



<Tech Academy>

最短4週間で未経験からプロを育てるオンライン学習サービス。

分からないことは現役プロの講師に直接質問ができます。


<Tech Camp>

将来的にエンジニアとして自由に働きたいという方にオススメ。

就職活動の支援までしてくれるオンライン学習サービスです。



<Aidemy>

3か月集中講座でAIを使ったアプリ(VR/ARなど)が作れるように一気通貫してサポートする学習サービス。

画像認識を使ったアプリ開発に興味がある方はオススメです。



次回は、他のアンラップ方法について解説していきたいと思います。



 

コメント

  1. 伊藤 より:

    ありがとうございます。
    勉強になります。

  2. phn03085 より:

    これからもよろしくお願いいたします

タイトルとURLをコピーしました