#Optional<Wrapped>型 とは
Optional<Wrapped>型とは、値が存在するか空かのいずれかを表す型です。
swiftでは基本的にnilを許容しないですが、
nilを許容する必要がある場合はOptional<Wrapped>型を利用します。
Optional<Wrapped>型のWrappedとは
プレースホルダ型と言い実際にはWrappedを具体的なInt型やString型に置き換えて使用します。
Optional<Wrapped>のように<>の中にプレースホルダ型を持つ型をジェネリック型と言います。
ジェネリック型については別記事て記載します。
nilを許容する必要がある場合とは、どのような状況か・・・。
twitterのアイコンなどでnilが使えるのではないかなと思います。
twitterのアカウントを作成する際に、
ユーザ名は必須ですが、アイコンは任意だと思います。
その時に、アイコンがnilを許容しない設計だと、
アイコン画像を設定しないといけなくなると思います。
個人的にはそういう時に使うんだろうなーと思いました、
##Optional<Wrapped>型の作成方法
Optional型の作成方法は二通りあるらしいのですが、
一般的に使用される方しか覚えてないのでそちらを共有します。
Optional型には、Optional型と、非Optional型があります。
Optional<Wrapped>型を作成する方法はものすごく簡単で、!や?を付けるだけです。
var a: Int // 非Optional型 -> nilを許容しない
var b: Int? // Optional<Int>型 -> nilを許容する
変数aは、いつも通りの宣言ですね。
変数aには何か値を代入して初期化しないとコンパイルエラーがおきます。
しかし、変数bはOptional型でnilを許容するので
初期化しなくてもコンパイルエラーは起きません。
つまり、変数aはコンパイルエラー、変数bはnilという状態になります。
!や?を語尾に付けるだけでnilを許容するようになるなんてOptionalは便利だ!
と思いますが、実は面倒な部分があります。
var a: Int? // Optional型
//print関数でログ出力
print(a) // nil
//type関数で変数aの型を表示
type(of:a) // Optional<Int>
まだ何も代入していないので、print() でnilが返されるのは想定内ですが、
変数aは、Int型かと思いきやOptional<Int>型になります。
var a: Int? // Optional型
a = 1
//print関数でログ出力
print(a) // Optional(1)
//type関数で変数aの型を表示
type(of:a) // Optional<Int>
さらに、変数aに1を代入すると、
print()関数の結果がOptional(1)
type()関数の結果がOptional<Int>
Optionalってなんぞや!!
当時は訳が分からず5回ぐらい叫びました(笑)
まず、Optional型というのは、nilを許容する型です。
なので1を代入したとしてもまたどこかでnilが代入される可能性があります。
そのような不確かなものをswift様が許す訳もなく、
Int型と同じくくりにせずOptional<Int>としているっぽいです。
なので、Int型とOptional<Int>型の計算は、もちろん出来ません。
var a: Int = 10 // Int型
var b: Int? = 100 // Optional<Int>型
var c = a + b // 10 + Optional(100) -> コンパイルエラー
nilを許容出来るようにするのは便利ですが、
このようにOptional型は通常では使えなくなっております。
では、どのようにしてOptional型を扱うのか。
Optional型で宣言した変数はずっと使えないのでは不便です。
しかし解決策があります。
それは、Optional型のアンラップです。
Optional型の変数をアンラップすることにより、
通常のInt型やString型と同じように利用できます。
今回はOptional型の紹介ですので、
アンラップについては別の記事に記載します。
そちらをご覧いただけると幸いです。
以上、ありがとうございました!