Swift

optional型についてまとめ

More than 3 years have passed since last update.

Swiftを某社で勉強し始めて、1週間が経ちました。

Qiitaにあるswift関連の記事は初学者には優しくないなと思い、初学者でもわかるような記事を更新していきたいと思います。


Optional型とは?


  • Appleの「安全のための設計」の一つ

  • 変数の中身やメソッドの返り値が nil になる可能性をプログラムで明示することを可能になり、プログラマがその扱いを間違えた時にコンパイラが警告やエラーを出すことができる


nilの使われ方まとめ


  • メソッドの返り値として、処理に成功すれば期待される値、失敗すればnilを返す。

  • メソッドの引数として指定したい場合は指定したい値、省略したい場合はnilを渡す

  • オブジェクトのプロパティの初期化前の値としてnilを持つ。

Swiftでは、 String型、Int型などの型を持つ変数にnilを格納することができない設計になっている

--> 変数やメソッドの返り値がString型である限り、その内容がnilである事はないことを保証している(逆にnilだとコンパイルエラーが生じる)

--> Optional型はString型やInt型と同じく一つの型ですが、 「nilまたは何らかの値を格納する」 という点で特殊な型だと言える。


Optional型の宣言と初期化


optional型の宣言.

var optionalString: Optional<String>



optional型の宣言と値の格納.

var optionalString: Optional<String>

optionalstring = "Hello, Swift"
// {Some "Hello, Swift"}
optionalstring = nil


optional型の宣言と初期化.

var optionalInt: Optional<Int> = 4



Optional型のアンラップ

Optional型に格納した値は アンラップ することで元の型のメソッドを使用できるようになる。

これは、元の型をOptional型で ラップしていたものを アンラップして元の型に戻す、という意味合いが含まれている。

Optional型のアンラップには以下の4つの方法がある


  1. Forced Unwrapping

  2. Optional Binding

  3. Optional Chaining

  4. Implicitly Unwrapped Optional



Forced Unwrapping


Optional型の値や変数は後ろに「!」記号をつけることでアンラップして元の型に戻すことができる。

注意点:

変数や値がnilである場合、返される値の使い方によっては実行時にランタイムエラーとなりアプリは強制終了してしまう

いつ使う?

中身がnilでないことがわかっている場合もしくはnilでないことを確認した上で使用する


Forced_Unwrappingの例.

var optionalString: Optional<String> = "Hello, Swift"

//アンラップして変数に代入
var unwrappedString: String = optionalString!
unwrappedString.lowercaseString //"hello,swift"

//アンラップしてそのまま使用
optionalString!.lowercaseString //"hello, swift"



nilかどうかの確認.

if optionalString != nil {

optionalString!.lowercaseString
}



Optional Binding


中身がnilでないかの確認とアンラップを同時に行う構文。

いつ使う?

中身がnilであるか否かによらず使える


Optional_Bindingの例.

var optionalString: Optional<String> = "Hello, Swift"

if let unwrappedString = optionalString {
unwrappedString.lowercaseString
//"hello, swift"
}



Optional Chaining


Optional型の変数を元の型に戻さず、元の型のメソッドを使用することを目的。

いつ使う?

中身がnilでないことがわかっている場合もしくはnilでないことを確認した上で使用する


Optional_Chainingの例.

var optionalString: Optional<String> = "Hello, Swift"

optionalString?.lowercaseString
//{Some "hello, swift"}

「?」記号をつけることで、変数をアンラップしてlowercaseStringプロパティを参照しているのだが、値や変数がnilの場合はOptional Chainingの結果はnilになってしまう。

Optional Chainingでは、 値がnilでなければ処理をし、nilならなにもしないという処理がサクッとかける。



Implicitly Unwrapped Optional


swiftにはnilと任意の型の値を格納するもう一つの型としてImplicitlyUnwrappedOptional型もある。

特徴

使用時には自動的にアンラップされる

注意点

ImplicitlyUnwrappedOptional型もその値がnilの時にアンラップしようとするとランタイムエラーとなる可能性あり

いつ使う?

ImplicitlyUnwrappedOptional型もnilでないことが宣言時に確定する場合にのみ使用することを推奨


ImplicitlyUnwrappedOptional型の宣言と初期化.

var optionalString: ImplicitlyUnwrappedOptional<String> = "Hello,Swift"

optionalString.lowercaseString
//"hello,swift"


Optional型の省略形


2つのOptional型の省略形.

var optionalString: String? = "Hello, Swift"

var optionalInt: Int! = nil

前半は、Optional型の宣言時の省略形

後半は、ImplicitlyUnwrappedOptional型の省略形

注意点

省略形の「!」や「?」記号はOptional Chainingで使用する「?」記号やForced Unwrappingで使用する「!」記号とは意味合いが異なる。